使用InnoDB引擎时,引用其他表中主键的外键是否需要自己的索引。
类似地,在复合键中,显然主键(a,b,c,d)不适用于(b,c),因此如果b和c是引用其他表中主键的外键,那么它们不应该有自己的自动创建索引
引用其他表中主键的外键是否需要自己的索引。
它们需要一个索引。如果不存在合适的索引,则在声明外键约束时将创建一个新索引。但是,如果索引已存在且外键列位于索引的最左边,则将使用该索引并且不会创建新索引。
示例:
create table MyTable (
id int primary key,
x int,
y int,
z int,
index (x, y, z)
);
如果我将
x
上的外键添加到另一个表,它可以使用现有索引,因为 x
是索引中最左边的列。
如果我在
y
上添加外键到另一个表,它必须创建一个新索引,因为它不能使用 y
不是最左边列的现有索引。
alter table MyTable
add foreign key (x) references OtherTable (id),
add foreign key (y) references OtherTable (id);
演示:https://dbfiddle.uk/qmW2GiC-
结果表:
CREATE TABLE `MyTable` (
`id` int(11) NOT NULL,
`x` int(11) DEFAULT NULL,
`y` int(11) DEFAULT NULL,
`z` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `x` (`x`,`y`,`z`),
KEY `y` (`y`),
CONSTRAINT `MyTable_ibfk_1` FOREIGN KEY (`x`) REFERENCES `OtherTable` (`id`),
CONSTRAINT `MyTable_ibfk_2` FOREIGN KEY (`y`) REFERENCES `OtherTable` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
看到已为
y
创建了新索引。