MySQL是否会自动索引外键列?

1l5u6lss  于 2023-05-05  发布在  Mysql
关注(0)|答案(8)|浏览(145)

MySQL是否会自动索引外键列?

mkshixfv

mkshixfv1#

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

0ejtzxu1

0ejtzxu12#

显然,索引是按照the link robert has posted中的指定自动创建的。
InnoDB需要对外键和被引用的键进行索引,这样外键检查可以很快,不需要表扫描。在引用表中,必须有一个索引,在该索引中,外键列以相同的顺序作为第一列列出。如果索引不存在,则会在引用表上自动创建索引。(这与某些旧版本不同,在旧版本中,索引必须显式创建,否则外键约束的创建将失败。)index_name如果给定,则按前面所述使用。
InnoDB and FOREIGN KEY Constraints

67up9zun

67up9zun3#

对于那些正在寻找报价从5.7docs
MySQL需要对外键和引用的键建立索引,这样外键检查就可以很快,而不需要表扫描。在引用表中,必须有一个索引,在该索引中,外键列以相同的顺序作为第一列列出。如果引用表不存在这样的索引,则会在引用表上自动创建该索引。如果创建另一个可用于强制外键约束的索引,则以后可能会以静默方式删除此索引。index_name(如果给定)如前所述使用。

9jyewag0

9jyewag04#

如果执行ALTER TABLE(而不是CREATE TABLE),则不会自动获取索引,至少根据the docs(该链接适用于5.1,但对于5.5也是如此):
[...]使用ALTER TABLE向表添加外键约束时,请记住首先创建所需的索引。

yizd12fk

yizd12fk5#

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

tcomlyy6

tcomlyy66#

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

mdfafbf17#

是的,MySQL会在定义外键约束时自动为外键列创建索引。如果你已经在一个外键列上定义了一个索引,MySQL将不会创建一个新的索引。相反,它将使用现有的索引来强制执行外键约束。

ztyzrc3y

ztyzrc3y8#

无法自动获取索引键

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

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

ALTER TABLE photographs ADD INDEX (photograph_id);

相关问题