0

我正在考虑 MySQL 5.6 InnoDB 表的以下模式。我无法决定使用哪些键:

    "CREATE TABLE IF NOT EXISTS `context` ("
    "  `text_id` INT NOT NULL AUTO_INCREMENT,"
    "  `doc_id` INT NOT NULL,"
    "  `text` VARCHAR(255),"
    "  PRIMARY KEY (`text_id`),"
    "  UNIQUE KEY `text_uk` (`text`),"                  <<< OPTION 1
    "  UNIQUE KEY `docidtext_uk` (`doc_id`, `text`),"   <<< OPTION 2
    ") ENGINE=InnoDB "

我可以要求列text是唯一的(选项 1),或者我可以允许一些重复的条目,而是在+text 上放置一个复合唯一键(选项 2)。从存储的角度来看,选项 1 显然更有效,但查询速度对我们来说是更重要的问题。doc_idtext

鉴于它text很长,因此导致唯一键效率低下,我怀疑使用复合键可能会导致更快的查询(注意doc_id是整数,因此相对非常有效)。但是,我对 MySQL 内部结构不够熟悉,无法理解复合键是否以这种方式工作。

如果读取速度是我们最关心的问题,那么哪些选项是最佳实践?保留两把钥匙有什么害处或好处吗?

笔记:

  • 查询此表的唯一函数始终可以访问doc_idand的值text(此函数的唯一目的是查找text_id)。
  • 该表目前没有数据,但我们预计它最终将包含大约 10 亿行。
  • 每个doc_id列的其他行中最多有 99 个重复项doc_id
  • 列中可能有数百万个单元格,text其中前 20 多个字符相同(所有文本片段都很短且属于相同的一般主题)。
  • 目标是对text列进行重复数据删除。对于此特定应用程序,这样做有望节省大量空间。
4

3 回答 3

0

将 Text_id 作为主键。
在 doc_id 和 text 上添加索引,并在您开始遇到性能问题时包含 text_id。小心过早的优化。

于 2015-04-29T20:00:14.400 回答
0

根据我阅读的内容,您需要将文档连接到文本。由于某些有趣的原因,该文本可以被复制。就个人而言,我永远不会寻找重复的文本并为此进行优化,但人们很有趣,所以这里是:

  • 创建一个只包含文本的表格。散列文本(因此您获得的数据更少)并从中创建唯一索引。您的文本现在可以任意长。

  • 插入链接文档和文本的表中,通过外键链接它们。

恭喜,您已经对某些内容进行了微优化。现在,如果你决定真的,真的压缩所有可能的空间并超级优化东西,那么你可能会转向这个 MySQL 存储引擎,与 InnoDB 相比,你将获得高达12 倍的空间减少。

于 2015-04-30T13:00:59.797 回答
0

目标是什么?

  • 重复数据删除text以节省空间?似乎不太可能节省足够的钱。
  • 'Normalize'text这样如果你需要改变一个字符串,你可以在一个地方改变它?没有任何暗示。
  • 发现其中doc包含一个给定的text? 显然不需要。
  • 在其他几个表中节省空间text?显然只有另一张桌子。

结论:由于您似乎不需要任何证明此表合理的东西,所以

吻。

只需放在text需要它的桌子上。如果我在 4 个要点之一上错了,我会改变我的答案。

编辑

如果会有很多重复的字符串,并且目标是重复数据删除,我建议

CREATE TABLE context (
    text_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    text VARCHAR(255) NOT NULL,
    PRIMARY KEY(text_id),
    UNIQUE(text)            -- for finding dup
) ENGINE=InnoDB;            -- because of the way it clusters

INSERT INTO context (text) VALUE ('$escaped_text')
    ON DUPLICATE KEY UPDATE text_id = LAST_INSERT_ID(text_id);  -- see ref manual
$text_id = LAST_INSERT_ID();

如果字符串往往很长,请改用 VARBINARY,并在客户端中压缩/解压缩。对于典型文本,压缩会将文本缩小 3 倍。

于 2015-04-29T22:19:58.943 回答