2015-05-15 3 views
1

В базе данных MySQL, где есть связи между таблицами и первичным ключом одной таблицы, хранится как внешний ключ во второй таблице, есть ли необходимость в выполнении соединения?Отношения и присоединения MySQL

Если есть, то в чем смысл объявления отношений? Я бы взял удар в темноте и сказал, что это как-то связано с индексированием или смежными таблицами, которые могут быстрее найти связанные записи? Я пробовал Google, но не могу найти много. Я уверен, что в этом есть масса, но я не знаю, какие ключевые слова нужно искать.

Ниже приведен пример таблицы 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; 

При выполнении любой вид соединения, делает двигатель ЬшоВВ использовать отношения каким-либо образом? Благодарю.

+0

Внешние ключи также могут замедлять производительность в зависимости от того, есть ли у вас много обновлений/удалений, привязанных к внешнему ключу. Если ваше совпадение хорошее, вы можете просто создать поле с одинаковым типом данных и поместить на него регулярный индекс. –

ответ

2

Пункт объявления внешнего ключа заключается в обеспечении согласованности данных. Для получения желаемых данных вам все равно потребуется СОЕДИНЕНИЕ. В MySQL внешние ключи улучшат производительность, но не ожидают, что они будут сопоставимы с индексами.

+0

'FOREIGN KEYs' имеют нулевое воздействие на' SELECTs'. Они замедляют «INSERT», чтобы проверить на согласованность. –

+0

ОП - это нищий новичок. Это может помочь объяснить, что на самом деле означает целостность данных между ссылочными и ссылочными таблицами; почему это необходимо для базы данных; что происходит, если это не так. – PerformanceDBA

0

Чтобы сделать запрос с использованием двух таблиц, вам нужно указать JOIN ... ON ..., чтобы сказать, как они связаны. FOREIGN KEYs являются не, участвующих в SELECT и оказывает отрицательное воздействие на производительность SELECT. Вы не должны «иметь» FOREIGN KEYs для выполнения SELECTs.

A FOREIGN KEY Используется во время INSERTs (и других записей), чтобы убедиться, что последующий JOIN действительно найдет что-то в другой таблице. Во время записи накладные расходы - INSERT активно проверяет (через индекс), что таблица с ссылками имеет указанную строку.

FOREIGN KEYsмай также выполняет каскадную операцию. Например, DELETE может привести к тому, что произойдет еще один DELETE. Я предпочитаю такой контроль в своем коде приложения.