Restricții cu chei străine

În prezent, InnoDB - subsistemul primar de stocare pentru MySQL, care acceptă chei străine, astfel încât cei care au nevoie de ele, alegerea este limitată la 1. Compania MySQL AB a promis că serverul într-o zi propria va sprijini cheile străine într-un mod care nu depind de subsistemul de stocare , dar în viitorul apropiat, InnoDB rămâne singurul subsistem important în care această funcție este implementată. Prin urmare, o vom lua în considerare.







Cheile externe nu costă. Ca o regulă, prezența lor înseamnă că serverul ar trebui să caute în alt tabel de fiecare dată când anumite date sunt schimbate. Deși forța InnoDB operațiune de accelerare construiește un index, nu elimină toate consecințele negative ale acestor controale. În acest caz, poate fi obținut chiar un indice foarte mare, care are o selectivitate extrem de scăzută. De exemplu, să presupunem că o masă uriașă are coloana statut și este necesar ca acesta să conțină numai valorile corecte, și toți cei trei. Necesar pentru acest indice suplimentar crește în mod semnificativ dimensiunea totală a tabelului - chiar dacă foarte mici și de dimensiunea coloanei, în special în cazul în care lungimea mare a cheii primare; în timp ce indexul în sine nu este necesar pentru nimic altceva decât verificarea cheii externe.







Cu toate acestea, în unele cazuri, cheile externe pot îmbunătăți performanța. Dacă esențial să se asigure că datele din cele doua tabele sunt coerente, eficace serverul de testare de încărcare, și nu o face la nivel de aplicație. Tastele externe sunt, de asemenea, utile pentru cascadă șterge și actualizare, cu toate că aceste operațiuni sunt efectuate linie cu linie, care este mai lent decât o cerere de actualizare mai multe tabele sau discontinuu.

Datorită cheilor externe, interogarea se poate "răspândi" în alte mese, ceea ce înseamnă blocarea încuietorilor. De exemplu, dacă încercați să inserați un rând într-o tabelă subordonată, constrângerea cheii străine va determina InnoDB să verifice valoarea corespunzătoare din tabelul principal. În acest caz, trebuie să setați o blocare pe rândul principal al mesei, astfel încât nimeni să nu îl șterge până când tranzacția nu este finalizată. Acest lucru poate duce la așteptarea neașteptată a blocării și chiar la blocarea blocurilor pe care nu le accesați direct. Asemenea probleme sunt departe de a fi evidente intuitiv și este foarte dificil de rezolvat.

Uneori, în locul cheilor externe, puteți utiliza declanșatoarele. Pentru operații, cum ar fi în cascadă actualizări, chei străine sunt de declanșare mai rapide, dar în cazul în care singurul scop al cheii - constrângere de verificare, la fel ca în exemplul cu o coloană a stării, este posibil ca o scrie în mod eficient un declanșator pentru a include o listă explicită de valori valide (dar poți doar utilizați tipul de date ENUM).

Adesea, este logic să verificați restricțiile din aplicație, mai degrabă decât să utilizați cheile străine în acest scop.







Articole similare

Trimiteți-le prietenilor: