MySQL是否自动索引外键列?
8 回答
是的,但仅限于innodb。Innodb 是目前唯一一种实现了外键的表格式。
显然,根据 robert 已发布的链接中的指定,会自动创建一个索引。
InnoDB 需要外键和引用键上的索引,以便外键检查可以快速且不需要表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。如果引用表不存在,则会在引用表上自动创建此类索引。(这与一些旧版本形成对比,在这些旧版本中,索引必须显式创建,否则外键约束的创建将失败。) index_name,如果给定,如前所述使用。
是的,请参阅InnoDB 和 FOREIGN KEY 约束。
如果您执行 ALTER TABLE(而不是 CREATE TABLE),则不会自动获取索引,至少根据文档(链接适用于 5.1,但适用于 5.5):
[...] 当您使用 ALTER TABLE 向表添加外键约束时,请记住首先创建所需的索引。
对于那些正在寻找5.7
docs报价的人:
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);