Wie kann MyISAM "schneller" als InnoDB sein, wenn
- MyISAM muss Festplattenlesevorgänge für die Daten durchführen?
- InnoDB verwendet den Pufferpool für Indizes und Daten und MyISAM nur für den Index?
mysql
innodb
myisam
storage-engine
jcho360
quelle
quelle
Antworten:
Nur so kann MyISAM schneller sein als InnoDB unter diesen besonderen Umständen
MyISAM
Beim Lesen können die Indizes einer MyISAM-Tabelle einmal aus der .MYI-Datei gelesen und in den MyISAM-Schlüssel-Cache geladen werden (Größe nach key_buffer_size ). Wie können Sie die .MYD-Datei einer MyISAM-Tabelle schneller lesen lassen? Mit diesem:
Ich habe darüber in meinen letzten Beiträgen geschrieben
InnoDB
OK, was ist mit InnoDB? Führt InnoDB Festplatten-E / A für Abfragen durch? Überraschenderweise tut es das ja !! Sie denken wahrscheinlich, ich bin verrückt danach, das zu sagen, aber es ist absolut wahr, auch für SELECT-Abfragen . An dieser Stelle wundern Sie sich wahrscheinlich: "Wie in aller Welt führt InnoDB Festplatten-E / A-Vorgänge für Abfragen durch?"
Alles geht zurück auf InnoDB als ACID- reklamierte Transactional Storage Engine. Um InnoDB Transactional zu sein, hat es die Unterstützung
I
inACID
, die Isolation ist. Die Technik zur Aufrechterhaltung der Isolierung für Transaktionen erfolgt über MVCC, Multiversion Concurrency Control . In einfachen Worten, InnoDB zeichnet auf, wie Daten aussehen, bevor Transaktionen versuchen, sie zu ändern. Wo wird das aufgenommen? In der System-Tablespace-Datei besser bekannt als ibdata1. Das erfordert Disk - I / O .VERGLEICH
Welche zufälligen Faktoren bestimmen, wer schneller ist, da sowohl InnoDB als auch MyISAM Festplatten-E / A durchführen?
DELETEs
undUPDATEs
In einer Umgebung mit vielen Lesevorgängen ist es daher möglich, dass eine MyISAM-Tabelle mit einem festen Zeilenformat besser als InnoDB-Lesevorgänge aus dem InnoDB-Pufferpool abschneidet, wenn in die in ibdata1 enthaltenen Rückgängig-Protokolle genügend Daten geschrieben werden, um das Transaktionsverhalten zu unterstützen InnoDB-Daten auferlegt.
FAZIT
Planen Sie Ihre Datentypen, Abfragen und Speicher-Engines sorgfältig. Sobald die Daten wachsen, kann es sehr schwierig werden, Daten zu verschieben. Fragen Sie einfach Facebook ...
quelle
In einer einfachen Welt ist MyISAM schneller beim Lesen und InnoDB schneller beim Schreiben.
Sobald Sie gemischte Lese- / Schreibvorgänge einführen, ist InnoDB dank seines Zeilensperrmechanismus auch beim Lesen schneller.
Ich habe vor einigen Jahren einen Vergleich von MySQL-Speicher-Engines geschrieben, der bis heute gültig ist und die einzigartigen Unterschiede zwischen MyISAM und InnoDB aufzeigt.
Nach meiner Erfahrung sollten Sie InnoDB für alles verwenden, außer für Cachetabellen mit hohem Leseaufwand, bei denen der Verlust von Daten aufgrund von Korruption nicht so kritisch ist.
quelle
Um die Antworten hier auf die mechanischen Unterschiede zwischen den beiden Motoren zu ergänzen, präsentiere ich eine empirische Geschwindigkeitsvergleichsstudie.
In Bezug auf die reine Geschwindigkeit ist MyISAM nicht immer schneller als InnoDB, aber meiner Erfahrung nach ist es für PURE READ-Arbeitsumgebungen in der Regel um den Faktor 2,0 bis 2,5 schneller. Offensichtlich ist dies nicht für alle Umgebungen geeignet - wie andere geschrieben haben, fehlen MyISAM Dinge wie Transaktionen und Fremdschlüssel.
Ich habe unten ein bisschen Benchmarking durchgeführt - ich habe Python für Loops und die Timeit-Bibliothek für Timing-Vergleiche verwendet. Aus Gründen des Interesses habe ich auch die Speicher-Engine integriert, die die beste Leistung auf der ganzen Linie bietet, obwohl sie nur für kleinere Tabellen geeignet ist (Sie stoßen immer wieder darauf,
The table 'tbl' is full
wenn Sie das MySQL-Speicherlimit überschreiten). Die vier Arten der Auswahl, die ich ansehe, sind:Zunächst habe ich drei Tabellen mit der folgenden SQL erstellt
mit 'MyISAM' anstelle von 'InnoDB' und 'memory' in der zweiten und dritten Tabelle.
1) Vanille wählt
Abfrage:
SELECT * FROM tbl WHERE index_col = xx
Ergebnis: Unentschieden
Die Geschwindigkeit ist im Großen und Ganzen gleich und wie erwartet linear in der Anzahl der auszuwählenden Spalten. InnoDB scheint etwas schneller zu sein als MyISAM, aber das ist wirklich marginal.
Code:
2) Zählt
Abfrage:
SELECT count(*) FROM tbl
Ergebnis: MyISAM gewinnt
Dieser zeigt einen großen Unterschied zwischen MyISAM und InnoDB - MyISAM (und Speicher) protokolliert die Anzahl der Datensätze in der Tabelle, sodass diese Transaktion schnell und 0 (1) ist. Die Zeit, die InnoDB benötigt, um zu zählen, steigt superlinear mit der Tabellengröße in dem von mir untersuchten Bereich. Ich vermute, dass viele der in der Praxis beobachteten Beschleunigungen von MyISAM-Abfragen auf ähnliche Effekte zurückzuführen sind.
Code:
3) Bedingte Auswahl
Abfrage:
SELECT * FROM tbl WHERE value1<0.5 AND value2<0.5 AND value3<0.5 AND value4<0.5
Ergebnis: MyISAM gewinnt
Hier arbeiten MyISAM und Arbeitsspeicher ungefähr gleich und übertreffen InnoDB bei größeren Tabellen um etwa 50%. Diese Art von Abfrage scheint die Vorteile von MyISAM zu maximieren.
Code:
4) Unterauswahlen
Ergebnis: InnoDB gewinnt
Für diese Abfrage habe ich einen zusätzlichen Tabellensatz für die Unterauswahl erstellt. Jedes ist einfach zwei Spalten von BIGINTs, eine mit einem Primärschlüsselindex und eine ohne Index. Aufgrund der großen Tischgröße habe ich die Memory Engine nicht getestet. Der Befehl zum Erstellen einer SQL-Tabelle lautete
Dabei wird in der zweiten Tabelle erneut 'InnoDB' durch 'MyISAM' ersetzt.
In dieser Abfrage belasse ich die Größe der Auswahltabelle bei 1000000 und verändere stattdessen die Größe der unterausgewählten Spalten.
Hier gewinnt die InnoDB leicht. Nachdem wir eine vernünftige Größentabelle erreicht haben, skalieren beide Motoren linear mit der Größe der Unterauswahl. Der Index beschleunigt den MyISAM-Befehl, hat jedoch interessanterweise nur geringe Auswirkungen auf die InnoDB-Geschwindigkeit. subSelect.png
Code:
Ich denke, die Botschaft zum Mitnehmen ist, dass Sie, wenn Sie wirklich auf Geschwindigkeit bedacht sind, die von Ihnen ausgeführten Abfragen einem Benchmarking unterziehen müssen, anstatt davon auszugehen, welcher Motor besser geeignet ist.
quelle
SELECT * FROM tbl WHERE index_col = xx
- Hier sind zwei Faktoren, die wahrscheinlich zu mehr Variationen in der Grafik führen: Primärschlüssel vs. Sekundärschlüssel; Index ist zwischengespeichert vs nicht.SELECT COUNT(*)
ist ein klarer Gewinner für MyISAM, bis Sie eineWHERE
Klausel hinzufügen .Welche ist schneller? Beides könnte schneller sein. YMMV.
Welches solltest du verwenden? InnoDB - Absturzsicher usw. usw.
quelle