MySQL忘了自动为外键创建索引?

时间:2010-03-12 00:46:30

标签: mysql database-design indexing foreign-keys innodb

运行以下SQL语句后,您会看到,在第一个 {之后,MySQL已经为我question_tag_tag_id_tag_id列自动创建了非唯一索引tag_id {1}}语句已经运行。

但是在第二个 ALTER TABLE语句运行之后,我认为MySQL还应该在ALTER TABLE列上为我自动创建另一个非唯一索引question_tag_question_id_question_id

但正如您从question_id语句输出中看到的那样,它不存在。

为什么MySQL忘记了第二个 SHOW INDEXES声明?

顺便说一句,因为我已经创建了 ALTER TABLEquestion_id_tag_id_idx列使用的唯一索引question_id。为每个索引创建一个单独的索引是多余的吗?

tag_id

2 个答案:

答案 0 :(得分:2)

来自documentation

  

必须有一个索引   外键列列为   第一列的顺序相同。这样   在引用上创建索引   如果没有,则自动表格   存在。

question_id是主键和question_id_tag_id_idx索引的第一列。因此,外键不需要进一步的索引。 question_id_tag_id_idx索引实际上是不必要的,因为主键具有相同顺序的相同列。主键是唯一的clustered indexes

对于question_tag_tag_id_tag_id外键,会创建索引,因为没有以tag_id开头的现有索引。

question_id_tag_id_idx索引(或主键)可用于question_id上的外键但不能用于tag_id上的外键的原因由本节解释在文档中的how MySQL uses indexes上:

  

如果表格有多列   index,任何最左边的前缀   index可以由优化器使用   找到行。例如,如果你有   三列索引(col1,col2,   col3),你有索引搜索   (col1),(col1,col2)上的功能,   和(col1,col2,col3)。

外键需要能够在引用表(question_tag)中快速查找值。 question_id中首先显示question_id_tag_id_idx(最左边的前缀),因此可以使用此索引。 tag_id出现在第二位,因此无法使用索引。

答案 1 :(得分:1)

在多列索引中,我相信您可以免费获得第一列的索引,就好像只有该列的索引一样。

更新:这只是特定索引的情况,正如另一个回答者所指出的那样,它们是非空的并且变成“聚簇索引”。