Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Best Practice zum Erstellen von Indizes für Ihre MySQL-Tabellen – Rolling Index Builds

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:

  1. Erstellen des Index direkt auf dem Master
  2. 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 Tweet

Automatisierung 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!