Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL definiert die Spalte als UNIQUE mit AUTO_INCREMENT statt als Primary Key

MySQL ohne explizit definieren Primärschlüssel ist eine sehr, sehr schlechte Idee.
Wenn ein PK fehlt, erstellt MySQL einen impliziten (aber sehr realen) ganzzahligen, automatisch inkrementierenden Primärschlüssel.
Dieser PK wird in jeden Sekundärschlüssel in InnoDB aufgenommen und bestimmt Ihre primäre Sortierreihenfolge in MyISAM.

Konsequenz
Sie haben gerade die Leistung jedes Auswählens, Einfügens und Aktualisierens verlangsamt.
Zu keinem Zweck.

InnoDB:zusätzliche Suche erforderlich, um Tabellendaten abzurufen
In InnoDB muss eine zusätzliche Suche durchgeführt werden, da alle sekundären Indizes auf die PK und nicht auf die Zeilen selbst verweisen.

MyISAM:Platzverschwendung
In MyISAM ist die Strafe nicht so groß, aber Sie schleppen immer noch ein 4-Byte-unbenutztes Feld mit sich herum, das nicht verwendet wird.

InnoDB + MyISAM:Nutzlose Generierung des Autoincrement-Felds
Weil ein implizites Autoincrementing PK erstellt wird und Sie auch einen zusätzlichen Autoincrementing-Schlüssel benötigen, um Joins durchzuführen; Um doppelte Autoincrement-Felder zu verhindern, haben Sie jetzt nicht 1, sondern 2 Tabellensperren pro Einfügung.

InnoDB:with joins the lookup probem does not doubles
Wenn Sie einen Join mit einem Feld durchführen, das nicht dem PK entspricht, muss InnoDB eine zusätzliche Suche pro Join durchführen um zu den Datensätzen dieser anderen Tabelle zu gelangen.

InnoDB:Am schlimmsten ist, dass Sie den Vorteil der Abdeckung von Indizes verlieren
Sie haben eine der besten Optimierungen in InnoDB deaktiviert, die Indizes abdeckt.
Wenn MySQL die Abfrage nur mit den Daten in den Indizes lösen kann, wird es die Tabelle niemals lesen, was zu einer erheblichen Geschwindigkeit führen wird gewinnen. Jetzt, da 50 % jedes Indexes in InnoDB ungenutzter Speicherplatz sind, haben Sie gerade Ihre Chancen, dass diese Optimierung verwendet wird, zunichte gemacht.

Bitte schlagen Sie diesen Auftragnehmer mit einem Hinweisstock!

Links:
http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/ (langsamer Link, aber lesenswert).
O'Reilly über die abdeckenden Indizes von InnoDB http://tag1consulting.com/MySQL_Engines_MyISAM_vs_InnoDB

Übrigens , wenn Ihr Auftragnehmer sagt, es spielt keine Rolle, weil er MyISAM verwendet, schlagen Sie ihn noch einmal, Sie sollten immer InnoDB verwenden, es sei denn, Sie haben einen guten Grund, es nicht zu tun.
InnoDB ist viel sicherer in der Produktion, MyISAM hat seine verwendet, wird aber zu leicht beschädigt.