在MySQL数据库中,表之间存在关系,并且一个表的主键作为外键存储在第二个表中,是否仍需要执行连接?
如果有,宣布这种关系有什么意义?我在黑暗中捅了一下并说它与索引或相关表有关,可以更快地找到相关记录吗?我试过谷歌这个,但似乎找不到多少。我确定这里有负载,但我不知道要搜索的关键字。
以下是表1和表2的示例:
------------------- Table 1 ----------------------
CREATE TABLE IF NOT EXISTS `db_hint`.`user` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`fb_id` INT NOT NULL,
`last_logged_in` DATETIME NULL,
`permissions` INT UNSIGNED NOT NULL,
PRIMARY KEY (`id`),
INDEX `permissions_id_idx` (`permissions` ASC),
CONSTRAINT `permissions_id`
FOREIGN KEY (`permissions`)
REFERENCES `db_hint`.`permissions` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
----------------- Table 2 ----------------------
CREATE TABLE IF NOT EXISTS `db_hint`.`user_stat` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT UNSIGNED NOT NULL,
PRIMARY KEY (`id`),
INDEX `user_id_idx3` (`user_id` ASC),
CONSTRAINT `user_id`
FOREIGN KEY (`user_id`)
REFERENCES `db_hint`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
当执行任何类型的连接时,InnoDB引擎是否以任何方式使用该关系?感谢。
答案 0 :(得分:2)
声明外键的目的是强制数据一致性。 您仍然需要JOIN才能获得所需的数据。 在MySQL中,外键可以提高性能,但不能与索引相提并论。
答案 1 :(得分:0)
要执行涉及两个表的查询,您需要JOIN ... ON ...
来说明它们之间的关系。 FOREIGN KEYs
中SELECT
不,SELECT
的效果为零。你没有"必须有" FOREIGN KEYs
执行SELECTs
。
在FOREIGN KEY
(和其他写入)期间使用INSERTs
来验证后续JOIN
是否会在另一个表中实际找到某些内容。这是写入期间的开销 - INSERT
主动检查(通过索引)引用的表具有指示的行。
FOREIGN KEYs
可能也会进行级联操作。例如,DELETE
可能导致另一个DELETE
发生。我更喜欢在我的应用程序代码中控制这个。