MySQL会自动索引外键列吗?
答案 0 :(得分:194)
是的,但仅限于innodb。 Innodb是目前唯一实现了外键的表格格式。
答案 1 :(得分:117)
显然,the link robert has posted中指定的索引是自动创建的。
InnoDB需要外键和引用键的索引,以便外键检查速度快,不需要进行表扫描。在引用表中,必须有一个索引,其中外键列以相同的顺序列为第一列。 如果索引不存在,会自动在引用表上创建这样的索引。(这与某些旧版本形成对比,其中必须明确创建索引或创建外键约束会失败。)index_name,如果给定,则如前所述使用。
答案 2 :(得分:21)
答案 3 :(得分:11)
如果你执行ALTER TABLE(而不是CREATE TABLE),至少根据the docs(链接用于5.1,但5.5的相同),你不会自动获取索引:
[...]使用ALTER TABLE向表中添加外键约束时,请记住首先创建所需的索引。
答案 4 :(得分:4)
如前所述,它适用于InnoDB。起初我认为许多其他(特别是MS SQL和DB2)没有这样做很奇怪。当表行非常少时,TableSpace扫描仅比索引扫描更好 - 因此对于绝大多数情况,外键需要被索引。然后它有点打击我 - 这并不一定意味着它必须是一个独立的(一列)索引 - 它在MySQL的自动FK索引中。所以,可能这就是MS SQL,DB2(Oracle我不确定)等原因让它留给了DBA;毕竟大型表上的多个索引都会导致性能和空间问题。
答案 5 :(得分:4)
对于那些正在寻找5.7
docs引用的人:
MySQL要求外键和引用键上的索引 外键检查可以很快,不需要表扫描。在里面 引用表时,必须有一个索引所在的外键 列以相同顺序列为第一列。这样的 如果不是,则会自动在引用表上创建索引 存在。如果您创建,可能会稍后以静默方式删除此索引 另一个可用于强制执行外键约束的索引。 如果给定,则使用index_name,如前所述。
答案 6 :(得分:2)
是的,Innodb
提供此功能。您可以在FOREIGN KEY
子句之后放置一个外键名称,或者让它为MySQL创建一个名称。 MySQL自动创建一个名为foreign_key_name
的索引。
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
答案 7 :(得分:0)
是的,当您创建一个具有到另一个外键的表时,Mysql会自动索引外键。
答案 8 :(得分:-2)
无法自动使用索引键
ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)
您为示例照片和FOREIGN KEY创建的表的名称,例如photograph_id
。代码应该是这样的
ALTER TABLE photographs ADD INDEX (photograph_id);