ПредишенСледващото

В момента InnoDB - основната подсистема за съхранение на MySQL, който поддържа външни ключове, така че тези, които се нуждаят от тях, изборът е ограничен до 1. Компанията MySQL AB е обещал, че някой ден собствен сървър ще подкрепи външни ключове, по начин, не зависят от подсистемата за съхранение но в обозримо бъдеще, InnoDB е единственото основно подсистеми, в която се изпълняват тази функция. Ето защо, ние ще обсъдим.

Чуждестранните ключове не се струват безплатни. Като правило, тяхното присъствие означава, че сървърът трябва да изглежда в друга таблица, когато сменяте някои данни. Въпреки InnoDB сила операция ускорение изгражда индекс, то не премахва всички негативни последици от такива проверки. Той дори може да получите много голям индекс, който има много ниска селективност. Например, да предположим, че огромна маса има колона статус и изисква, че може да съдържа само точните стойности, както и всички, които са три. Изисква се за този допълнителен индекс значително да увеличи общия размер на масата - дори и ако много малък и от големината на колоната, особено ако голяма дължина на първичния ключ; а самата индекса не е необходима за нищо друго освен за проверка на външния ключ.

И все пак, в някои случаи, външни ключове могат да подобрят ефективността. Ако значение да се гарантира, че данните в двете свързани таблици са последователни, ефективното тестов сървър, а не да го направи на ниво приложение. Чуждестранните ключове са полезни и за каскада изтриване и обновяване, въпреки че тези дейности се извършват с един ред, който е по-бавен от заявката за актуализиране на няколко таблици или операция партида.

Заради външен ключ искането, може да "разпространява" към други таблици, което означава, че залавянето на ключалки. Например, когато се опитват да вмъкнете ред в подчинената таблица външен ключ проверка за ограничение сила InnoDB за съответната стойност на първичния масата. Необходимо е да се създаде ключалката на основната линия на масата, че никой не се изтрива, докато транзакцията приключи. Това може да доведе до неочаквано чакане заключване, а дори и мъртвите зони на масата, на която трябва да не се отнасят пряко. Такива проблеми са далеч от интуитивно очевидно и те са много трудни за решаване.

Понякога, вместо външни ключове, можете да използвате задейства. За операции като каскадни актуализации, външни ключове са по-бързи спусъка, но ако единствената цел на ключа - проверка ограничение, както в примера с колона от статуса, че е възможно ефективно напиши спусъка, за да се включи изрично списък с валидни стойности (но може просто да използвате тип данни ENUM).

Тя често има смисъл да се провери ограниченията в заявлението, а не да се използва за тази цел, външни ключове.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!