【发布时间】:2010-09-23 04:33:45
【问题描述】:
MySQL 会自动索引外键列吗?
【问题讨论】:
MySQL 会自动索引外键列吗?
【问题讨论】:
是的,但仅限于innodb。 Innodb 是目前唯一实现了外键的表格式。
【讨论】:
显然,索引是按照the link robert has posted 中的指定自动创建的。
InnoDB 需要外键和引用键的索引,以便外键检查可以快速且不需要表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。 如果引用表不存在,则会在引用表上自动创建此类索引。(这与某些旧版本相反,其中索引必须显式创建,否则创建外键约束会失败.) index_name,如果给定,如前所述使用。
【讨论】:
InnoDB permits a foreign key to reference any index column or group of columns. However, in the referenced table, there must be an index where the referenced columns are the first columns in the same order.
【讨论】:
如果您执行 ALTER TABLE(而不是 CREATE TABLE),则不会自动获取索引,至少根据 the docs (该链接适用于 5.1,但适用于 5.5):
[...] 当您使用 ALTER TABLE 向表添加外键约束时,请记住首先创建所需的索引。
【讨论】:
对于那些正在寻找来自5.7docs的报价的人:
MySQL 需要外键和引用键的索引,以便 外键检查可以很快并且不需要表扫描。在里面 引用表,必须有外键所在的索引 列按相同顺序列为第一列。这样一个 如果没有,则在引用表上自动创建索引 存在。如果您创建,此索引可能会在稍后被静默删除 另一个可用于强制外键约束的索引。 index_name,如果给定,则如前所述使用。
【讨论】:
如前所述,它适用于 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)
您创建的表的名称,例如照片和 FOREIGN KEY,例如 photograph_id。代码应该是这样的
ALTER TABLE photographs ADD INDEX (photograph_id);
【讨论】: