Optimale Engine für kleine Nachschlagetabellen in MySQL
-
26-09-2020 - |
Frage
Ich habe folgende Frage:Ich entwerfe eine Webanwendung mit mehreren Dutzend kleinen Nachschlagetabellen:Diese Tabellen enthalten normalerweise drei Spalten (ID, Name, Beschreibung) und einige Zeilen (meistens weniger als 50, maximal etwa 450).
Es wird erwartet, dass sich diese Nachschlagetabellen nur selten ändern (sie stammen aus dem Standard, der sich alle paar Jahre ändert) und werden nur verwendet, um:
- Fülloptionen in HTML auswählen
- mit anderen Datensätzen in Berichten verknüpft werden
Es wird nur geben SELECT
aussagen zu diesen Tabellen 99% der Fälle, aber es wird ziemlich viele davon geben.
Ich frage mich, welche Datenbank-Engine am effizientesten zu verwenden wäre?
Hier sind meine Überlegungen:
SPEICHER
- Profi:sehr schnell
- Nachteil:wenn der Server abstürzt, gehen alle Daten verloren und müssen neu erstellt werden
- Nachteil:unterstützt keine Fremdschlüssel
komprimiertes MyISAM
- Profi:schnell
- Nachteil:unterstützt keine Fremdschlüssel
InnoDB
- Profi:fremdschlüsselunterstützung
Was ich fragen möchte, ist, ob es einen signifikanten Vorteil gibt, etwas anderes zu verwenden als InnoDB - leistungsmäßig
Danke, Zbynek
Lösung
Ich habe eine ähnliche Frage im August 2011 beantwortet : Welches DBMS eignet sich für superschnelle Lesevorgänge und eine einfache Datenstruktur?
Da fragst du nach MySQL und welcher Speicher-Engine.Um ehrlich zu sein, ist es schwer zu sagen, denn es gibt seltene Fälle, in denen MyISAM InnoDB bei der Auswahl übertreffen kann.
Hier sind einige meiner früheren Beiträge zu dieser Kontroverse
Sep 20, 2011
: Das Beste von MyISAM und InnoDBMay 03, 2012
: Was ist schneller, InnoDB oder MyISAM?Jul 05, 2012
: InnoDB vs MyISAM mit vielen IndizesSep 26, 2012
: Wählen Sie MyISAM gegenüber InnoDB für diese Projektanforderungen;und langfristige Optionen
Sie könnten jetzt fragen :Warum sollte ich MyISAM jemals InnoDB vorziehen?
Schauen Sie sich dieses Diagramm an (erstellt von Vadim Tkachenko, CTO von Percona)
MyISAM speichert Indizes zwischen und Ihre Tabelle enthält 2 Indizes (PRIMÄRSCHLÜSSEL für ID und einen Index für Name).Auf der anderen Seite hat InnoDB zu viele bewegliche Teile, um Platz zu finden, insbesondere wenn der InnoDB-Pufferpool regelmäßig 16 KB Seiten laden und schließen muss.
Um fair zu sein, sollten Sie ein Experiment machen.
- Gehe zu meinem Beitrag Was sind die Hauptunterschiede zwischen InnoDB und MyISAM?.Lesen Sie es sorgfältig durch.
- Richten Sie einen Server mit MyISAM und all Ihren Tabellen mit ein
ROW_FORMAT=Fixed
(Siehe meinen Beitrag Welche Auswirkungen hat die Verwendung von CHAR vs VARCHAR auf ein Feld mit fester Größe auf die Leistung?) und verwenden Sie eine große schlüssel_puffer_größe. - Richten Sie einen anderen Server mit InnoDB und einem großen Server ein innodb_puffer_pool_größe.
- Fügen Sie Ihre Daten zu beiden Servern hinzu und fragen Sie sie wie verrückt ab.
Dies gibt Ihnen die beste Einschätzung für die Auswahl der Speicher-Engine für Ihren Datensatz.
PROBIEREN SIE ES AUS!!!
Andere Tipps
- "Komprimiertes MyISAM" - was ist das?Vielleicht "Archiv"?
- Komprimierung ist nicht erforderlich;die Tabellen sind zu klein und werden schnell vollständig zwischengespeichert.
FOREIGN KEYS
-- Warum?Sie haben Ihren Code debuggt, nicht wahr?Es wird keine baumelnden Dinge zu überprüfen geben.MEMORY
ist nicht unvernünftig, wenn sie schreiben 'Reload' -Code, der ausgeführt wird, wenn Sie den Server aufrufen, und alle Aktualisierungen der Tabelle werden in beide auf den Server geschriebenMEMORY
tabelle und das persistente Backup.MyISAM
ROW_FORMAT=FIXED
-- das ist eine alte Frauengeschichte;verwendenDYNAMIC
undVARCHARs
.- Innodbs "Clustered"
PRIMARY KEY
macht Suchvorgänge für Ihren Zweck etwas schneller als MyISAM. - Haben Sie wissen dass die Nachschlagetabellen eine spürbare Verlangsamung verursachen?Ich bezweifle ernsthaft, dass sie es sind.
- Tun nicht verwenden Sie Nachschlagetabellen für "kontinuierliche" Werte, z
FLOATs
undDATEs
.
Ich stimme für InnoDB ohne FKs.