注意:我四处搜索以查看此问题是否曾被提出过。我能够找到的所有现有问题都是询问复合索引排序,或现有表格上查询的列顺序。
说我有下表:
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_id
和bar_id
在复合索引中一起使用会很重要,但在这里它们不是。
如果它确实很重要,有没有办法在创建表后任意重新排列键? (类似于ALTER TABLE foobar ADD INDEX foo_id (foo_id) AFTER bar_id
的东西,我很确定它是无效的。)
答案 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