Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL definisce la colonna come UNIQUE con AUTO_INCREMENT invece che come chiave primaria

Definire MySQL senza esplicito chiavi primarie è una pessima idea.
Se manca una PK, MySQL creerà una chiave primaria intera implicita (ma molto reale) con incremento automatico.
Questa PK sarà inclusa in ogni chiave secondaria in InnoDB e determinerà il tuo ordinamento principale in MyISAM.

Conseguenza
Hai appena rallentato le prestazioni di ogni selezione, inserimento e aggiornamento.
Inutilmente.

InnoDB:ricerca aggiuntiva richiesta per accedere ai dati della tabella
In InnoDB è necessario eseguire una ricerca aggiuntiva, poiché tutti gli indici secondari fanno riferimento alla PK e non alle righe stesse.

MyISAM:spazio sprecato
In MyISAM la penalità non è eccezionale, ma stai comunque trascinando un campo inutilizzato di 4 byte che non viene utilizzato.

InnoDB + MyISAM:generazione inutile di campi di incremento automatico
Perché viene creata una PK a incremento automatico implicito e per eseguire i join è necessaria anche una chiave di autoincremento aggiuntivo; Per evitare campi di incremento automatico duplicati, ora non hai 1, ma 2 blocchi tabella per inserto.

InnoDB:con join il probem di ricerca sopra menzionato raddoppia
Se esegui un join utilizzando un campo che non è il PK, InnoDB deve eseguire una ricerca aggiuntiva per join per accedere ai record di quell'altra tabella.

InnoDB:peggio di tutto perdi il vantaggio di coprire gli indici
Hai disabilitato una delle migliori ottimizzazioni in InnoDB, che copre gli indici.
Se MySQL può risolvere la query utilizzando solo i dati negli indici, non leggerà mai la tabella, ciò comporterà una velocità significativa guadagno. Ora che il 50% di ogni indice in InnoDB è spazio inutilizzato, hai appena annullato le possibilità che l'ottimizzazione venga utilizzata.

Per favore, batti questo appaltatore con un indizio!

Collegamenti:
http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/ (link lento, ma consiglio la lettura).
O'Reilly sugli indici di copertura di InnoDB http://tag1consulting.com/MySQL_Engines_MyISAM_vs_InnoDB

BTW , se il tuo appaltatore dice che non importa molto perché sta usando MyISAM, battilo di nuovo, dovresti sempre usare InnoDB a meno che tu non abbia una buona ragione per non farlo.
InnoDB è molto molto più sicuro in produzione, MyISAM ha il suo utilizza ma viene danneggiato troppo facilmente.