MyISAM zum Lesen von Daten

10

Ich habe eine Tabelle mit ungefähr 1 Milliarde Zeilen, die zu 98% leseintensiv ist.

Ich habe versucht, die Datenbank mit verschiedenen Speicher-Engines (MyISAM und InnoDB) zu optimieren.

Führen Sie dann einige Tests durch, um die Leistung anzuzeigen

In der where-Klausel hatte ich eine Primärschlüssel-ID, und da MyISAM Key Cache den gesamten Index in seinem Puffer lädt, schien die Verwendung von MyISAM ziemlich schnell zu sein, etwa zweimal schneller als InnoDB

Aber für InnoDB schien es langsamer zu sein !! Verwendet InnoDB keinen Puffer zum Vorladen der Indizes?

Akash
quelle
Vielleicht kann einer der auslöserfreudigen Moderatoren, die zum Schließen der Frage abstimmen, ihre Motivationen erläutern?
pQd
Können Sie uns eine Vorstellung von der Größe der betreffenden Datenbank und Tabelle geben? Die Gesamtgröße auf der Festplatte wäre nützlich. Welche Spezifikation haben Sie auf dem Computer?
Dave Rix

Antworten:

6

Bevor Sie sich für MyISAM oder InnoDB entscheiden, müssen Sie beide Speicher-Engines dahingehend überprüfen, wie sie jeweils zwischengespeichert werden

MyISAM

Beim Lesen können die Indizes einer MyISAM-Tabelle einmal aus der .MYI-Datei gelesen und in den MyISAM-Schlüsselcache geladen werden (Größe nach key_buffer_size ). Wie können Sie die .MYD einer MyISAM-Tabelle schneller lesen lassen? Mit diesem:

ALTER TABLE mytable ROW_FORMAT=Fixed;

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 aus? Überraschenderweise ja ja !! Sie denken wahrscheinlich, ich bin verrückt danach, das zu sagen, aber es ist absolut wahr, selbst für SELECT-Anfragen . An diesem Punkt fragen Sie sich wahrscheinlich: "Wie in aller Welt führt InnoDB Festplatten-E / A für Abfragen aus?"

Alles geht darauf zurück, dass InnoDB eine ACID- beschwerdepflichtige Transactional Storage Engine ist. Um InnoDB Transactional zu sein, hat es die Unterstützung Iin ACID, die Isolation ist. Die Technik zur Aufrechterhaltung der Isolation 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 Systemtabellenbereichsdatei, 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 ausführen?

  • Größe der Spalten
  • Spaltenformat
  • Zeichensätze
  • Bereich numerischer Werte (erfordert ausreichend große INTs)
  • Zeilen werden blockweise aufgeteilt (Zeilenverkettung)
  • Datenfragmentierung durch DELETEsundUPDATEs
  • Größe des Primärschlüssels (InnoDB verfügt über einen Clustered-Index, für den zwei Schlüsselsuchen erforderlich sind)
  • Größe der Indexeinträge
  • Die Liste geht weiter...

EPILOG

In einer Umgebung mit starken Lesevorgängen ist es daher möglich, dass eine MyISAM-Tabelle mit einem festen Zeilenformat InnoDB-Lesevorgänge aus dem InnoDB-Pufferpool übertrifft, wenn genügend Daten in die in ibdata1 enthaltenen Rückgängig-Protokolle geschrieben werden, um das Transaktionsverhalten zu unterstützen den InnoDB-Daten auferlegt. Planen Sie Ihre Datentypen, Abfragen und Speicher-Engines sehr sorgfältig. Sobald die Daten wachsen, kann es sehr schwierig werden, Daten zu verschieben.

Übrigens habe ich vor 5 Tagen so etwas geschrieben: Wie ordne ich ein Speicherlimit für mySQL zu?

RolandoMySQLDBA
quelle
generiert innodbe wirklich Festplattenlesevorgänge, wenn sich alle Daten bereits im Pufferpool befinden und keine gleichzeitigen Datenänderungsanforderungen vorliegen, sondern nur Lesevorgänge?
pQd
Ich vermute, dass der Fragesteller, da er 1 Milliarde Zeilen in seiner Datenbank hat, wahrscheinlich nicht alles im RAM des Pufferpools zwischengespeichert hat. Daher sind Lesevorgänge erforderlich, um zu den Daten außerhalb des Pufferpools und auf der Festplatte zu gelangen.
Dave Rix
3

MyISAM läuft immer viel schneller als innodb, wenn keine Konflikte um die Daten bestehen. Fügen Sie mehrere Sitzungen hinzu, um dieselbe Tabelle zu aktualisieren, und innodb erhält sehr schnell den Leistungsvorteil.

Wie Sie das System für die 2 Motoren einstellen, ist sehr unterschiedlich.

Der Grund dafür, dass unterschiedliche Engines vorhanden sind, liegt darin, dass unterschiedliche Workloads / Zugriffsmuster vorhanden sind.

symcbean
quelle
2

du musst innodb 'aufwärmen'. B. durch erneutes Abspielen von Zugriffsprotokollen oder Ausführen einiger intelligenter Abfragen, die jeden Wert aus dem Index berühren.

Schauen Sie hier oder hier .

Ich hoffe, Sie verwenden keine MySQL-Standardeinstellungen für innodb - sie waren für Hardware ab ~ 2000 geeignet.

pQd
quelle
Ich habe Änderungen an der Standardkonfiguration vorgenommen, die Abfrage auch mehrmals ausgeführt, ungefähr 30 Mal, aber fast die gleichen Ergebnisse erzielt. Es war schneller nach ein paar Versuchen, blieb aber langsamer als MYISAM, benutzte auch MariaDB (neueste Version)
Akash
0

Nachdem ich InnoDB in MariaDB weiter optimiert hatte, erhöhte ich die innodb_buffer_pool_sizeGröße meiner InnoDB-Datenbank, da InnoDB damit begonnen hat, Zeilen schneller abzurufen

Ich nehme an, dass die Optimierung von InnoDB entsprechend Ihren Datenbankanforderungen sehr wichtig ist

Akash
quelle