Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL中外键的索引_Mysql - Fatal编程技术网

MYSQL中外键的索引

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

添加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 (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要求所有外键都有索引。你以前需要手动创建一个,现在它可以帮你。但是必须对外键进行索引。