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?
Antworten:
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:
Ich habe darüber in meinen letzten Beiträgen geschrieben
Sep 20, 2011
: /dba/5974/best-of-myisam-and-innodb/6008#6008 (Bitte zuerst lesen)May 10, 2011
: /dba/2640/what-is-the-performance-impact-of-using-char-vs-varchar-on-a-fixed-size-field/2643#2643 (TRADEOFF # 2)Aug 12, 2011
: /dba/4576/which-dbms-is-good-for-super-fast-reads-and-a-simple-data-structure/4589#4589 (Absatz 3)Jan 03, 2012
: /dba/10069/optimized-my-cnf-for-high-end-and-busy-server/10080#10080 (Unter der Überschrift Replikation )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
I
inACID
, 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?
DELETEs
undUPDATEs
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?
quelle
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.
quelle
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.
quelle
Überprüfen Sie diese Website, es hat sehr nützliche Informationen:
http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/
http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/
Sie können auch Ihr Dateisystem optimieren. Ich habe gute Leistungsergebnisse auf XFS mit optimalen Sunit- und Swidth-Werten (natürlich, wenn Sie RAID verwenden).
quelle
Nachdem ich InnoDB in MariaDB weiter optimiert hatte, erhöhte ich die
innodb_buffer_pool_size
Größe meiner InnoDB-Datenbank, da InnoDB damit begonnen hat, Zeilen schneller abzurufenIch nehme an, dass die Optimierung von InnoDB entsprechend Ihren Datenbankanforderungen sehr wichtig ist
quelle