我正在考虑 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_id
text
鉴于它text
很长,因此导致唯一键效率低下,我怀疑使用复合键可能会导致更快的查询(注意doc_id
是整数,因此相对非常有效)。但是,我对 MySQL 内部结构不够熟悉,无法理解复合键是否以这种方式工作。
如果读取速度是我们最关心的问题,那么哪些选项是最佳实践?保留两把钥匙有什么害处或好处吗?
笔记:
- 查询此表的唯一函数始终可以访问
doc_id
and的值text
(此函数的唯一目的是查找text_id
)。 - 该表目前没有数据,但我们预计它最终将包含大约 10 亿行。
- 每个
doc_id
列的其他行中最多有 99 个重复项doc_id
。 - 列中可能有数百万个单元格,
text
其中前 20 多个字符相同(所有文本片段都很短且属于相同的一般主题)。 - 目标是对
text
列进行重复数据删除。对于此特定应用程序,这样做有望节省大量空间。