MySQL UNIQUE KEY 设计 : compound INT + VARCHAR key vs. 单列 VARCHAR 键

标签 mysql innodb unique-key unique-index compound-key

我正在考虑 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/

相关文章:

mysql - SQL错误1215无法添加外键

如果存在具有 2 个特定列的行,则 MYSQL 更新表;如果不存在,则插入新行

java - 将项目 JRE 构建路径条目设置为 'JavaSE-1.7'

php - 获取一列中相同日期的数据另一列中的另一个日期数据

mysql - 如何加速 InnoDB count(*) 查询?

MySQL - 使一对值唯一

PostgreSQL - 重复的唯一键

.net - 将日期/时间字符串值转换为 .NET DateTime

mysql - Wordpress - 使用 $wpdb->update 并限制 1

mysql - 如何为MySQL InnoDB表正确建立索引并选择最佳主键