MySQL是否自动索引外键列?

MySQL是否自动索引外键列?

107015 次浏览

是的,参见InnoDB和外键约束

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

显然,索引是根据罗伯特发布的链接中指定的自动创建的。

InnoDB要求在外键和引用键上建立索引,这样外键检查就可以快速进行,而不需要表扫描。在引用表中,必须有一个索引,其中外键列以相同的顺序列在第一个列中。如果引用表中不存在这样的索引,则会自动在引用表中创建。(这与一些旧版本相反,在旧版本中,索引必须显式创建,否则外键约束的创建将失败。)index_name,如果给定,则使用如上所述。

InnoDB and FOREIGN KEY Constraints . sh

如前所述,它适用于InnoDB。起初,我觉得很奇怪,许多其他的(尤其是MS SQL和DB2)没有。表空间扫描只有在表行很少的情况下才比索引扫描好——所以在绝大多数情况下外键都需要被索引。然后它有点击中我-这并不一定意味着它必须是一个独立的(一列)索引-它是在MySQL的自动FK索引。所以,可能这就是为什么MS SQL, DB2(我不确定Oracle)等把它留给DBA的原因;毕竟,大表上的多个索引会导致性能和空间问题。

如果你执行ALTER TABLE(而不是CREATE TABLE),你不会自动获得索引,至少根据的文档(该链接适用于5.1,但适用于5.5):

[…当您使用ALTER table向表添加外键约束时,请记住首先创建所需的索引。

是的,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)

你创建的表的名称,例如photos和外键,例如photograph_id。代码应该是这样的

ALTER TABLE photographs ADD INDEX (photograph_id);

对于那些正在寻找5.7 文档引用的人:

MySQL需要在外键和引用键上建立索引 外键检查可以快速且不需要表扫描。在 引用表时,必须有外键所在的索引 列按照相同的顺序作为第一个列列出。这样一个 如果没有,则在引用表上自动创建索引 存在。如果您创建该索引,稍后可能会默默地删除该索引 可用于强制外键约束的另一个索引。

. Index_name,如果给出,则使用如上所述