MYSQL中外键的索引
添加FK后,以下MYSQL中外键的索引,mysql,Mysql,添加FK后,以下添加索引代码是否冗余 ALTER TABLE main ADD FOREIGN KEY (language_id) REFERENCES main_language (id); ALTER TABLE main ADD INDEX (language_id); 为什么?是的,它是多余的。添加外键约束将在语言id上隐式创建索引。如果您需要添加包含其他列的不同复合索引,则该索引不会是多余的,但单个列是多余的 ALTER TABLE main ADD FOREIGN KEY (lan
添加索引代码是否冗余
ALTER TABLE main ADD FOREIGN KEY (language_id) REFERENCES main_language (id);
ALTER TABLE main ADD INDEX (language_id);
为什么?是的,它是多余的。添加外键
约束将在语言id
上隐式创建索引。如果您需要添加包含其他列的不同复合索引,则该索引不会是多余的,但单个列是多余的
ALTER TABLE main ADD FOREIGN KEY (language_id) REFERENCES main_language (id);
-- This is redundant
ALTER TABLE main ADD INDEX (language_id);
-- This is not redundant
ALTER TABLE main ADD INDEX (other_column, language_id);
,如果在创建外键
时已有索引,MySQL将不会在外键
列上创建新索引
MySQL需要外键和引用键的索引,这样外键检查可以很快,而不需要扫描表。在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。如果引用表不存在,则会自动在引用表上创建这样的索引。如果您创建了另一个可用于强制外键约束的索引,则该索引可能会在以后以静默方式删除。索引名称(如果给定)如前所述使用
因此,由于索引列是从左到右使用的,如果列上已经有了此索引,则创建外键
约束将不需要创建新索引
-- Already has a composite index with the FK column listed first
ALTER TABLE main ADD INDEX (language_id, other_column);
-- This won't create a new index when the constraint is defined
ALTER TABLE main ADD FOREIGN KEY (language_id) REFERENCES main_language (id);
编辑:
根据上述段落中的注释:
如果您创建了另一个可用于强制外键约束的索引,则该索引可能会在以后以静默方式删除
…这些文档似乎暗示,如果您创建了建议的冗余索引,MySQL可能会悄悄删除它作为FORIEGN KEY
约束的一部分隐式创建的索引,因为可以使用显式创建的索引。因此,它可能不会继续维持这两个指数
同样,这表明添加上面的复合索引可能会导致MySQL不再需要维护FK
隐式创建的索引
ALTER TABLE main ADD FOREIGN KEY (language_id) REFERENCES main_language (id);
-- Adding this later may allow MySQL to drop the implicit index created with the FK
ALTER TABLE main ADD INDEX (language_id, other_column);
下面给出的答案比为上述问题提供的任何答案都要有力(所选答案为一句话)。我认为我们应该根据答案来回答这个问题。关于这个问题有一个老问题:索引的明确定义的另一个用途是选择索引名。否则MySql将使用列名。很抱歉下面的多次快速编辑--我在链接文档时学到了一些新东西…MySql要求所有外键都有索引。你以前需要手动创建一个,现在它可以帮你。但是必须对外键进行索引。