运行以下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 TABLE
和question_id_tag_id_idx
列使用的唯一索引question_id
。为每个索引创建一个单独的索引是多余的吗?
tag_id
答案 0 :(得分:2)
必须有一个索引 外键列列为 第一列的顺序相同。这样 在引用上创建索引 如果没有,则自动表格 存在。
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)
在多列索引中,我相信您可以免费获得第一列的索引,就好像只有该列的索引一样。
更新:这只是特定索引的情况,正如另一个回答者所指出的那样,它们是非空的并且变成“聚簇索引”。