MySQL是否会自动索引外键列?
mkshixfv1#
是的,但仅限于innodb。Innodb是目前唯一实现了外键的表格式。
0ejtzxu12#
显然,索引是按照the link robert has posted中的指定自动创建的。InnoDB需要对外键和被引用的键进行索引,这样外键检查可以很快,不需要表扫描。在引用表中,必须有一个索引,在该索引中,外键列以相同的顺序作为第一列列出。如果索引不存在,则会在引用表上自动创建索引。(这与某些旧版本不同,在旧版本中,索引必须显式创建,否则外键约束的创建将失败。)index_name如果给定,则按前面所述使用。InnoDB and FOREIGN KEY Constraints
67up9zun3#
对于那些正在寻找报价从5.7docs:MySQL需要对外键和引用的键建立索引,这样外键检查就可以很快,而不需要表扫描。在引用表中,必须有一个索引,在该索引中,外键列以相同的顺序作为第一列列出。如果引用表不存在这样的索引,则会在引用表上自动创建该索引。如果创建另一个可用于强制外键约束的索引,则以后可能会以静默方式删除此索引。index_name(如果给定)如前所述使用。
5.7
9jyewag04#
如果执行ALTER TABLE(而不是CREATE TABLE),则不会自动获取索引,至少根据the docs(该链接适用于5.1,但对于5.5也是如此):[...]使用ALTER TABLE向表添加外键约束时,请记住首先创建所需的索引。
yizd12fk5#
正如InnoDB所述。起初我觉得奇怪的是,许多其他的(特别是MS SQL和DB2)没有。只有在表行很少的情况下,TableSpace扫描才比索引扫描更好--所以在绝大多数情况下,外键都希望被索引。然后它有点击中我-这并不一定意味着它必须是一个独立的(一列)索引-在MySQL的自动FK索引中。所以,可能这就是MS SQL、DB2(我不确定是否使用Oracle)等将其留给DBA的原因;毕竟,大型表上的多个索引会导致性能和空间问题。
tcomlyy66#
是的,Innodb提供了这个。您可以在FOREIGN KEY子句后放置外键名称,或者让MySQL为您创建一个名称。MySQL会自动创建一个名为foreign_key_name的索引。
Innodb
FOREIGN KEY
foreign_key_name
CONSTRAINT constraint_name FOREIGN KEY foreign_key_name (columns) REFERENCES parent_table(columns) ON DELETE action ON UPDATE action
mdfafbf17#
是的,MySQL会在定义外键约束时自动为外键列创建索引。如果你已经在一个外键列上定义了一个索引,MySQL将不会创建一个新的索引。相反,它将使用现有的索引来强制执行外键约束。
ztyzrc3y8#
无法自动获取索引键
ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)
您创建的表的名称,例如照片和外键,例如photograph_id。代码应该是这样
photograph_id
ALTER TABLE photographs ADD INDEX (photograph_id);
8条答案
按热度按时间mkshixfv1#
是的,但仅限于innodb。Innodb是目前唯一实现了外键的表格式。
0ejtzxu12#
显然,索引是按照the link robert has posted中的指定自动创建的。
InnoDB需要对外键和被引用的键进行索引,这样外键检查可以很快,不需要表扫描。在引用表中,必须有一个索引,在该索引中,外键列以相同的顺序作为第一列列出。如果索引不存在,则会在引用表上自动创建索引。(这与某些旧版本不同,在旧版本中,索引必须显式创建,否则外键约束的创建将失败。)index_name如果给定,则按前面所述使用。
InnoDB and FOREIGN KEY Constraints
67up9zun3#
对于那些正在寻找报价从
5.7
docs:MySQL需要对外键和引用的键建立索引,这样外键检查就可以很快,而不需要表扫描。在引用表中,必须有一个索引,在该索引中,外键列以相同的顺序作为第一列列出。如果引用表不存在这样的索引,则会在引用表上自动创建该索引。如果创建另一个可用于强制外键约束的索引,则以后可能会以静默方式删除此索引。index_name(如果给定)如前所述使用。
9jyewag04#
如果执行ALTER TABLE(而不是CREATE TABLE),则不会自动获取索引,至少根据the docs(该链接适用于5.1,但对于5.5也是如此):
[...]使用ALTER TABLE向表添加外键约束时,请记住首先创建所需的索引。
yizd12fk5#
正如InnoDB所述。起初我觉得奇怪的是,许多其他的(特别是MS SQL和DB2)没有。只有在表行很少的情况下,TableSpace扫描才比索引扫描更好--所以在绝大多数情况下,外键都希望被索引。然后它有点击中我-这并不一定意味着它必须是一个独立的(一列)索引-在MySQL的自动FK索引中。所以,可能这就是MS SQL、DB2(我不确定是否使用Oracle)等将其留给DBA的原因;毕竟,大型表上的多个索引会导致性能和空间问题。
tcomlyy66#
是的,
Innodb
提供了这个。您可以在FOREIGN KEY
子句后放置外键名称,或者让MySQL为您创建一个名称。MySQL会自动创建一个名为foreign_key_name
的索引。mdfafbf17#
是的,MySQL会在定义外键约束时自动为外键列创建索引。如果你已经在一个外键列上定义了一个索引,MySQL将不会创建一个新的索引。相反,它将使用现有的索引来强制执行外键约束。
ztyzrc3y8#
无法自动获取索引键
您创建的表的名称,例如照片和外键,例如
photograph_id
。代码应该是这样