MariaDB 索引外键

问题描述 投票:0回答:1

使用InnoDB引擎时,引用其他表中主键的外键是否需要自己的索引。

类似地,在复合键中,显然主键(a,b,c,d)不适用于(b,c),因此如果b和c是引用其他表中主键的外键,那么它们不应该有自己的自动创建索引

sql mysql mariadb
1个回答
0
投票

引用其他表中主键的外键是否需要自己的索引。

它们需要一个索引。如果不存在合适的索引,则在声明外键约束时将创建一个新索引。但是,如果索引已存在且外键列位于索引的最左边,则将使用该索引并且不会创建新索引。

示例:

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
创建了新索引。

© www.soinside.com 2019 - 2024. All rights reserved.