CREATE TABLE语句中KEY的顺序是否重要?

时间:2016-07-20 16:24:13

标签: mysql indexing create-table

注意:我四处搜索以查看此问题是否曾被提出过。我能够找到的所有现有问题都是询问复合索引排序,或现有表格上查询的列顺序。

说我有下表:

CREATE TABLE `foobar` (
  `foo_id` int(11),
  `bar_id` int(11),
  KEY `foo_id` (`foo_id`),
  KEY `bar_id` (`bar_id`)
);

它上面有两个不相关的索引。如果我交换两个索引的定义,它可能如下所示:

CREATE TABLE `foobar` (
  `foo_id` int(11),
  `bar_id` int(11),
  KEY `bar_id` (`bar_id`),
  KEY `foo_id` (`foo_id`)
);

如果我在每个表上运行SHOW CREATE TABLE foobar,我可以看到每个表的KEY s排序之间存在差异。我的问题是,这个特定情况下的排序是否重要?我知道如果foo_idbar_id在复合索引中一起使用会很重要,但在这里它们不是。

如果它确实很重要,有没有办法在创建表后任意重新排列键? (类似于ALTER TABLE foobar ADD INDEX foo_id (foo_id) AFTER bar_id的东西,我很确定它是无效的。)

3 个答案:

答案 0 :(得分:1)

没有键的可视化表示,并且它不会增加任何开销以任何方式排列它们。键设置功能只是为现有列添加了质量,可以重新排列。

我能看到的唯一例外是,如果你经历了一些IDE(DB Forge,HeidiSQL,SequelPro等),它们将键值排列到它们生成的某个列表的顶部。然而,这是系统的一部分,它解释它并且与数据库性能无关。

答案 1 :(得分:0)

没有

所有键都“相等”。决定使用哪一个时都要考虑所有因素。使用具有最少“成本”的密钥。 (“成本”是一个复杂的公式,涉及以单向和另一种方式执行查询的努力。)

如果您使用的是InnoDB,那么拥有PRIMARY KEY真的是个好主意。

如果您的表是“多对多”映射表,这里有进一步的建议: http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table

相关主题:“复合”索引是具有多个列的索引。 (例如,INDEX(a,b)。)列的顺序会产生影响。

答案 2 :(得分:-1)

您可以在altertable comanad中使用modify

ALTER TABLE table_name MODIFY foo_id int AFTER bar_id