我以前从未使用过外键。我总是将 id 放在一个键列中,但它不是外键。所以它就像一个外键,但它不是。
所以如果我有以下 2 个表
CREATE TABLE `accounts` (
`account_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(60) NOT NULL,
`owner_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`account_id`),
KEY `owner_id` (`owner_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `users` (
`user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(60) NOT NULL
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
列 account.owner_id 链接到 users.user_id 但没有设置外键关系。
所以我可以做这样的事情
SELECT
a.name AS account_name,
u.name AS user_name FROM
accounts AS a INNER JOIN users AS u ON u.user_id = a.owner_id
因此,在了解了 FOREIGN KEYS 是什么以及它们做了什么之后,我创建了一个像这样的外键。
ALTER TABLE accounts
ADD CONSTRAINT fk_owner_id FOREIGN KEY(owner_id)
REFERENCES users(user_id) ON DELETE NO ACTION ON UPDATE CASCADE;
但是,我注意到性能发生了变化,因为它们的系统速度变慢了很多。我不确定添加 FOREIGN KEYs 是否会重用性能?或者在向表中添加外键时是否会降低性能?请注意,我的数据库中有很多表和列。所以我做了很多 INNER/LEFT/RIGHT JOINS 并且我将它们标识为 FOREIGN KEYS 的所有列都被编入索引。请注意,我没有向此列添加任何索引,因为它们在将 FOREIGN 键添加到我的数据库之前已经存在。
我的问题是,外键会降低 UPDATE/INSERT/DELETE/SELECT 的性能吗?当我们指定 ON DELETE NO ACTION ON UPDATE NO ACTION 时添加 FOREIGN KEY 约束也有好处吗?
谢谢