Indem Sie geeignete Indizes für Ihre MySQL-Tabellen haben, können Sie die Leistung von SELECT-Abfragen erheblich verbessern. Aber wussten Sie, dass das Hinzufügen von Indizes zu Ihren Tabellen an sich ein teurer Vorgang ist und je nach Größe Ihrer Tabellen lange dauern kann? Während dieser Zeit werden Sie wahrscheinlich auch eine verschlechterte Leistung von Abfragen feststellen, da Ihre Systemressourcen auch mit der Indexerstellung beschäftigt sind. In diesem Blogbeitrag diskutieren wir einen Ansatz zur Optimierung des MySQL-Indexerstellungsprozesses, sodass Ihre reguläre Arbeitslast nicht beeinträchtigt wird.
Rollende MySQL-Indexerstellung
Wir nennen diesen Ansatz eine „Rollierende Indexerstellung“ – wenn Sie über ein MySQL-Master-Slave-Replikat-Set verfügen, können Sie den Index knotenweise fortlaufend erstellen. Sie sollten den Index nur auf den Slave-Knoten erstellen, damit die Leistung des Masters nicht beeinträchtigt wird. Wenn die Indexerstellung auf den Slaves abgeschlossen ist, stufen wir den aktuellen Master herab und stufen einen der aktuellen Slaves als neuen Master ein. Zu diesem Zeitpunkt wird der Indexaufbau auf dem ursprünglichen Master-Knoten (der jetzt ein Slave ist) fortgesetzt. Aufgrund des Failovers wird die Verbindung zu Ihrer Datenbank für einen kurzen Zeitraum (mehrere zehn Sekunden) unterbrochen. Dies kann jedoch durch Wiederholungsversuche auf Anwendungsebene überwunden werden.
Leistungsvorteile der fortlaufenden Indexerstellung
Wir haben ein kleines Experiment durchgeführt, um die Leistungsvorteile der fortlaufenden Indexerstellung zu verstehen.
Der Test verwendete einen MySQL-Datensatz, der mit Sysbench erstellt wurde und 3 Tabellen mit jeweils 50 Millionen Zeilen enthielt. Wir haben eine Last auf dem MySQL-Master mit 30 Clients erzeugt, die eine ausgeglichene Arbeitslast (50 % Lese- und 50 % Schreibvorgänge) für 10 Minuten ausgeführt haben, und gleichzeitig einen einfachen sekundären Index für eine der Tabellen in zwei Szenarien erstellt:
- Erstellen des Index direkt auf dem Master
- Index auf dem Slave erstellen
MySQL-Testbed-Konfiguration
MySQL-Instanztyp | EC2-Instanz m4.large mit 8 GB RAM |
---|---|
Bereitstellungstyp | 2-Knoten-Master-Slave-Set mit halbsynchroner Replikation |
MySQL-Version | 5.7.25 |
Leistungsergebnisse
Szenario | Workload-Durchsatz (Abfragen pro Sekunde) | 95. Perzentil-Latenz |
---|---|---|
Indexerstellung auf Master | 453,63 | 670 ms |
Rollende Indexerstellung | 790.03 | 390 ms |
Imbiss
Indem wir die Indexerstellung direkt auf dem MySQL-Master ausgeführt haben, konnten wir nur 60 % des Durchsatzes erzielen, der durch die Ausführung der Indexerstellung auf dem MySQL-Slave durch einen fortlaufenden Vorgang erreicht wurde. Die 95. Perzentil-Latenz von Abfragen war ebenfalls 1,8-mal höher, wenn die Indexerstellung auf dem Master-Server stattfand.
Best Practice zum Erstellen von Indizes für Ihre #MySQL-TabellenClick To TweetAutomatisierung der fortlaufenden Indexerstellung
ScaleGrid automatisiert die fortlaufende Indexerstellung für Ihre MySQL-Bereitstellung mit einer einfachen Benutzeroberfläche, um sie zu initiieren.
In der obigen Benutzeroberfläche können Sie Ihre Datenbank und Ihren Tabellennamen sowie „Index hinzufügen“ als Änderungsoperation für die Tabelle auswählen. Geben Sie dann einen Spaltennamen und einen Indexnamen an, und ein Alter Table-Befehl wird generiert und für Sie angezeigt. Sobald Sie auf „Erstellen“ klicken, wird die Indexerstellung fortlaufend Knoten für Knoten ausgeführt.
Zusätzlich unterstützt ScaleGrid auch andere einfache Alter-Table-Operationen wie das Hinzufügen einer neuen Spalte zu Ihrer Tabelle in fortlaufender Weise. Bleiben Sie dran für meinen nächsten Blogpost mit weiteren Details!