为什么在 MySQL 中添加 FK 约束很慢?

Jam*_*all 5 mysql foreign-key optimization

我正在 MySQL 5.1.53 中进行一些实验,并且遇到了一个我只是不明白的情况。

CREATE TABLE A (
    `pk` INT(11) NOT NULL,
    `fk` INT(11) NOT NULL,
    PRIMARY KEY `pk_A` (`pk`),
    KEY `idx_fk` (`fk`)
) ENGINE=INNODB;

SET foreign_key_checks=0;

ALTER TABLE `A` ADD FOREIGN KEY `idx_fk` (`fk`) REFERENCES `parent` (`pk`);
Run Code Online (Sandbox Code Playgroud)

据我所知,这应该只会将约束添加到表元数据中以供将来的数据执行,并且应该是 O(1) 操作 - 我们已经使用“SETforeign_key_checks=0”关闭了实际检查约束并且它应该使用 idx_fk 索引(在 ADD FOREIGN KEY 子句中指定 - 可能是多余的),因此它不必创建任何内容或以任何方式迭代数据。

然而,当我运行 ALTER TABLE 时,表越大,该操作就越慢。

它在做什么以及为什么这么慢?

war*_*yen 1

CREATE TABLE A (
    `pk` INT(11) NOT NULL,
    `fk` INT(11) NOT NULL,
    PRIMARY KEY (`pk`),
    KEY `idx_fk` (`fk`)
) ENGINE=INNODB;

SET foreign_key_checks=0;

ALTER TABLE `A` ADD CONSTRAINT `fk_idx_fk` FOREIGN KEY (`fk`) REFERENCES `parent` (`pk`);
Run Code Online (Sandbox Code Playgroud)

添加了 CONSTRAINT 关键字以显式指定外键约束的名称为 fk_idx_fk。这确保了外键约束具有唯一的名称。