MySQL是否会自动索引外键列?

MySQL是否会自动索引外键列?

是的,但只在Innodb上。 Innodb是目前唯一实现了外键的表格格式

很明显,一个索引是按照罗伯特发布的链接自动创build的。

InnoDB需要对外键和引用键进行索引,以便外键检查可以快速且不需要表扫描。 在引用表中,必须有一个索引,其中外键列以相同顺序排列为第一列。 如果索引表不存在,则会在引用表上自动创build这样的索引。 (这与一些较早的版本形成鲜明对比,其中索引必须被显式创build,否则外键约束的创build将失败)。如前所述,使用index_name(如果给定)。

InnoDB和FOREIGN KEY约束

是的,请参阅InnoDB和FOREIGN KEY约束 。

如果您执行ALTER TABLE(而不是CREATE TABLE),则至less根据文档 (链接为5.1,但对于5.5为相同),则不会自动获取索引:

[…]在使用ALTER TABLE向表中添加外键约束时,请记住先创build所需的索引。

正如InnoDB所说的那样。 起初,我认为奇怪的是,许多其他(特别是MS SQL和DB2)没有。 当只有很less的表行时,TableSpace扫描只比索引扫描要好 – 因此绝大多数情况下外键都需要索引。 然后这种打击我 – 这并不一定意味着它必须是一个独立的(一列)索引 – 它是在MySQL的自动FK索引。 所以,可能是MS SQL,DB2(Oracle不知道)等等把它留给DBA吧, 毕竟大表上的多个索引可能会导致性能和空间的问题。

是的, Innodb提供这个。 您可以在FOREIGN KEY子句之后放置一个外键名称,或者让它为MySQL创build一个名称。 MySQL会自动使用foreign_key_name名称创build一个索引。

 CONSTRAINT constraint_name FOREIGN KEY foreign_key_name (columns) REFERENCES parent_table(columns) ON DELETE action ON UPDATE action 

对于那些正在寻找来自5.7 文档的报价:

MySQL需要对外键和引用键进行索引,以便外键检查可以很快并且不需要表扫描。 在引用表中,必须有一个索引,其中外键列以相同顺序排列为第一列。 如果索引表不存在,则会在引用表上自动创build这样的索引。 如果您创build另一个可用于强制实施外键约束的索引,则此索引可能稍后会自动放弃。 如前所述,使用index_name。

索引键无法自动使用

 ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY) 

您创build的表格名称,例如照片和FOREIGN KEY,例如photograph_id 。 代码应该是这样的

 ALTER TABLE photographs ADD INDEX (photograph_id);