我正在考虑 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
中有一些重复的条目而是将复合唯一键放在 doc_id
上+ text
(选项 2)。从存储角度来看,选项 1 显然更高效,但查询速度是我们目前更重要的考虑因素。
鉴于text
很长,因此会产生低效的唯一键,我怀疑使用复合键可能会导致更快的查询(注意 doc_id
是一个整数,因此相对非常高效)。然而,我对 MySQL 内部结构还不够熟悉,无法理解复合键是否以这种方式工作。
如果阅读速度是我们最关心的问题,那么以下哪个选项是最佳实践?保留两把 key 有什么坏处或好处吗?
注释:
- 查询此表的唯一函数始终可以访问
doc_id
的值和text
(此函数的唯一目的是查找text_id
)。 - 该表当前没有数据,但我们预计它最终将容纳大约 10 亿行。
- 每个
doc_id
doc_id
的其他行中最多有 99 个重复项柱子。 text
中可能有数百万个单元格前 20 多个字符相同的列(所有文本片段都很短并且属于同一一般主题)。- 目标是对
text
进行重复数据删除柱子。对于这个特定的应用程序,这样做预计可以节省大量空间。
最佳答案
将 Text_id 作为主键。
在 doc_id 和 text 上添加索引,并在开始出现性能问题时包含 text_id。小心过早的优化。
关于MySQL UNIQUE KEY 设计 : compound INT + VARCHAR key vs. 单列 VARCHAR 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29953193/