MySQL是否会自动为外键列建立索引?
是的,但仅适用于InnoDB。 InnoDB目前是唯一实现外键约束的预装表格格式。
显然,根据罗伯特发布的链接,索引会自动创建。
InnoDB需要在外键和参考键上创建索引,以便外键检查可以快速进行,而不需要进行表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序列出为第一列。如果不存在这样的索引,则会自动在引用表上创建。(这与某些旧版本形成对比,在这些版本中,必须明确创建索引或外键约束的创建将失败。)如前所述,如果给出index_name,则使用它。
对于那些正在寻找来自5.7文档的引用的人:
MySQL要求在外键和参考键上建立索引,以便外键检查可以快速进行且不需要表扫描。 在引用表中,必须有一个索引,其中将外键列按相同顺序列为第一列。 如果不存在这样的索引,则会自动在引用表上创建此索引。 如果创建了另一个可用于强制执行外键约束的索引,则此索引可能会被静默删除。如果提供了index_name参数,则如前所述使用它。
如果你使用ALTER TABLE(而不是CREATE TABLE)来操作,就不会自动获取索引,至少根据文档来说(链接指向5.1版本,但5.5版本也相同):
[...] 当你使用ALTER TABLE来向表中添加外键约束时,记得先创建所需的索引。
正如所述,它对InnoDB有用。一开始我认为很奇怪,许多其他数据库(尤其是MS SQL和DB2)没有使用这个功能。只有在表行非常少的情况下,表空间扫描才比索引扫描更好 - 因此,在绝大多数情况下,外键需要被索引。然后我想到了一个点 - 这并不一定意味着它必须是独立的(单列)索引 - 就像MySQL的自动FK索引一样。因此,也许这就是MS SQL、DB2(我不确定Oracle)等将其留给DBA的原因;毕竟,在大型表上有多个索引可能会影响性能和空间。
是的,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
无法自动获取索引键
ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)
您创建的表的名称,例如照片,以及外键,例如photograph_id
。代码应该像这样:
ALTER TABLE photographs ADD INDEX (photograph_id);