MySQL会自动索引外键列吗?

时间:2008-11-20 04:19:26

标签: mysql database indexing

MySQL会自动索引外键列吗?

9 个答案:

答案 0 :(得分:194)

是的,但仅限于。 Innodb是目前唯一实现了外键的表格格式。

答案 1 :(得分:117)

显然,the link robert has posted中指定的索引是自动创建的。

  

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

InnoDB and FOREIGN KEY Constraints

答案 2 :(得分:21)

是的,请参阅InnoDB and FOREIGN KEY Constraints

答案 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);