296

MySQL是否自动索引外键列?

4

8 回答 8

263

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

于 2008-11-20T04:33:23.793 回答
147

显然,根据 robert 已发布的链接中的指定,会自动创建一个索引。

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

InnoDB 和外键约束

于 2009-07-17T19:22:52.093 回答
23

是的,请参阅InnoDB 和 FOREIGN KEY 约束

于 2008-11-20T04:23:03.940 回答
12

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

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

于 2013-02-08T08:50:46.060 回答
11

对于那些正在寻找5.7 docs报价的人:

MySQL 需要外键和引用键上的索引,以便外键检查可以快速且不需要表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。如果引用表不存在,则会在引用表上自动创建此类索引。如果您创建另一个可用于强制外键约束的索引,则此索引可能会在稍后被静默删除。index_name,如果给定,如前所述使用。

于 2017-07-25T08:51:53.147 回答
5

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

于 2010-06-28T23:35:28.110 回答
3

是的,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
于 2015-11-24T11:56:07.377 回答
-2

无法自动使用索引键

ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)

您创建的表格的名称,例如照片和 FOREIGN KEY photograph_id。代码应该是这样的

ALTER TABLE photographs ADD INDEX (photograph_id);
于 2015-12-24T06:45:35.047 回答