Я раньше не использовал FOREIGN KEYS. Я всегда помещал его в ключевой столбец, но не нужен внешний ключ. поэтому он действует как внешний ключ, но это не так.После преобразования столбцов ключей MySQL в столбцы FOREIGN сайт замедлился
так что если у меня есть следующие 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 повторное использование производительности или нет? или есть ли снижение производительности при добавлении внешних ключей в таблицу? Обратите внимание, что в моей базе данных много таблиц и столбцов. поэтому я делаю много INNER/LEFT/RIGHT JOINS, и все столбцы, где я идентифицировал их как FOREIGN KEYS, индексируются. Заметки, что я не добавлял никаких индексов в эти столбцы, поскольку все они уже существуют до добавления ключей FOREIGN в мою базу данных.
мой вопрос, будут ли ИНОСТРАННЫЕ КЛЮЧИ снижать производительность на UPDATE/INSERT/DELETE/SELECT? Также есть преимущество добавления ограничения FOREIGN KEY, когда мы указали ON DELETE NO ACTION ON UPDATE NO ACTION?
Благодаря
С самого начала все, что вы сделали, выглядит правильно, и не должно было быть удара производительности. Вы уверены, что замедление связано с запросом, который вы предоставили? Попробуйте запустить тот же запрос с помощью EXPLAIN перед ним, посмотрите, обеспечивает ли оптимизатор какое-либо понимание. –
Я не уверен, что он чувствует, что весь сайт замедлился, а не мирный запрос. он поднял флаг, когда вижу, что система работает медленно. Поэтому я не был уверен, является ли это проблемой FOREIGN KEYS или нет. так вы предлагаете использовать FK или нет? – Jaylen
Ya, используйте FK, когда это возможно. Смягчение этой ответственности на уровне базы данных сделает ваше приложение более легким (код мудрый) и гарантирует, что вы не закончите сиротские строки в базе данных. –