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 时,表越大,该操作就越慢。
它在做什么以及为什么这么慢?
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。这确保了外键约束具有唯一的名称。