MySQL indicizza automaticamente le colonne chiave esterne?

MySQL indicizza automaticamente le colonne chiave esterne?

Sì, ma solo su Innodb. Innodb è l’unico formato di tabella attualmente spedito che ha implementato chiavi esterne

Apparentemente un indice viene creato automaticamente come specificato nel link che Robert ha pubblicato .

InnoDB richiede indici su chiavi esterne e chiavi di riferimento in modo che i controlli delle chiavi esterne possano essere veloci e non richiedere una scansione della tabella. Nella tabella di riferimento, deve esistere un indice in cui le colonne chiave esterna sono elencate come prime colonne nello stesso ordine. Tale indice viene creato automaticamente sulla tabella di riferimento se non esiste. (Ciò è in contrasto con alcune versioni precedenti, in cui gli indici dovevano essere creati esplicitamente o la creazione di vincoli di chiavi esterne non sarebbe riuscita.) Index_name, se specificato, viene usato come descritto in precedenza.

Vincoli InnoDB e FOREIGN KEY

Sì, vedi Vincoli InnoDB e FOREIGN KEY .

Non si ottiene automaticamente l’indice se si esegue una ALTER TABLE (invece di CREATE TABLE), almeno secondo i documenti (il collegamento è per 5.1 ma è lo stesso per 5.5):

[…] Quando aggiungi un vincolo di chiave esterna a una tabella usando ALTER TABLE, ricorda di creare prima gli indici obbligatori.

Come dichiarato, fa per InnoDB. All’inizio ho pensato che fosse strano che molti altri (in particolare MS SQL e DB2) non lo facessero. Le scansioni TableSpace sono migliori delle scansioni di indici solo quando ci sono poche righe di tabella, quindi per la maggior parte dei casi una chiave esterna dovrebbe essere indicizzata. Poi mi ha colpito – questo non significa necessariamente che debba essere un indice stand alone (una colonna) – dove si trova nell’indice FK automatico di MySQL. Quindi, potrebbe essere questo il motivo per cui MS SQL, DB2 (Oracle non ne sono sicuro) ecc. Lo lasciano al DBA; dopo tutti gli indici multipli su tabelle di grandi dimensioni può causare problemi con prestazioni e spazio.

Per coloro che cercano citazione da 5.7 documenti :

MySQL richiede indici su chiavi esterne e chiavi di riferimento in modo che i controlli delle chiavi esterne possano essere veloci e non richiedere una scansione della tabella. Nella tabella di riferimento, deve esistere un indice in cui le colonne chiave esterna sono elencate come prime colonne nello stesso ordine. Tale indice viene creato automaticamente sulla tabella di riferimento se non esiste. Questo indice potrebbe essere rilasciato silenziosamente in un secondo momento, se si crea un altro indice che può essere utilizzato per applicare il vincolo di chiave esterna. index_name, se specificato, viene utilizzato come descritto in precedenza.

Sì, Innodb fornisce questo. È ansible inserire un nome di chiave esterna dopo la clausola FOREIGN KEY o lasciare che MySQL crei un nome per voi. MySQL crea automaticamente un indice con il nome foreign_key_name .

 CONSTRAINT constraint_name FOREIGN KEY foreign_key_name (columns) REFERENCES parent_table(columns) ON DELETE action ON UPDATE action 

Non è ansible utilizzare automaticamente la chiave indice

 ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY) 

Nome della tabella che hai creato per esempio fotografie e FOREIGN KEY per esempio photograph_id . Il codice dovrebbe essere come questo

 ALTER TABLE photographs ADD INDEX (photograph_id);