Muss ich die MySQL-Tabelle nach dem Massenlöschen neu indizieren?

10

Ich habe eine Tabelle in MySQL mit viel INSERT und SELECT pro Sekunde. Einmal am Tag werden einige ältere Daten in großen Mengen gelöscht. Muss ich die Tabelle nach dem Löschen neu indizieren? Ich möchte die Leistung steigern. Kann jemand ein paar Tipps vorschlagen? Verwenden von 'innodb' als Speicher-Engine. Muss ich es ändern? Ich denke, es ist besser für das gleichzeitige Einfügen und Auswählen. Bitte geben Sie Ihre Vorschläge. Muss ich neu indizieren?

Danke im Voraus..

Ajay
quelle

Antworten:

10

Müssen Sie die Tabellen optimieren, wenn Sie InnoDB verwenden? Ja und Nein, abhängig von Ihrer Arbeitsbelastung und davon, ob Leistungsprobleme auftreten oder nicht.

Ein schamloses Kopieren und Einfügen aus der MySQL-Dokumentation :

Bei InnoDB-Tabellen wird OPTIMIZE TABLE ALTER TABLE zugeordnet, wodurch die Tabelle neu erstellt wird, um die Indexstatistik zu aktualisieren und nicht verwendeten Speicherplatz im Clustered-Index freizugeben. Dies wird in der Ausgabe von OPTIMIZE TABLE angezeigt, wenn Sie es in einer InnoDB-Tabelle ausführen, wie hier gezeigt:

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

Diese Operation verwendet keine schnelle Indexerstellung. Sekundärindizes werden nicht so effizient erstellt, da die Schlüssel in der Reihenfolge eingefügt werden, in der sie im Primärschlüssel angezeigt wurden. Siehe Abschnitt 14.14.6, „Einschränkungen der schnellen Indexerstellung“.

InnoDB speichert Daten mithilfe einer Seitenzuweisungsmethode und leidet nicht unter Fragmentierung auf die gleiche Weise wie ältere Speicher-Engines (wie MyISAM). Berücksichtigen Sie bei der Überlegung, ob die Optimierung ausgeführt werden soll oder nicht, die Arbeitslast der Transaktionen, die Ihr Server verarbeiten wird:

  • Ein gewisses Maß an Fragmentierung wird erwartet. InnoDB füllt die Seiten nur zu 93% aus, um Platz für Aktualisierungen zu lassen, ohne die Seiten teilen zu müssen.

  • Durch Löschvorgänge können Lücken entstehen, durch die die Seiten weniger gefüllt sind als gewünscht. Daher kann es sich lohnen, die Tabelle zu optimieren.

  • Aktualisierungen von Zeilen schreiben normalerweise die Daten auf derselben Seite neu, abhängig vom Datentyp und dem Zeilenformat, wenn genügend Speicherplatz verfügbar ist. Siehe Abschnitt 14.10.5, „Funktionsweise der Komprimierung für InnoDB-Tabellen“ und Abschnitt 14.12.1, „Übersicht über den InnoDB-Zeilenspeicher“.

  • Workloads mit hoher Parallelität können im Laufe der Zeit Lücken in den Indizes hinterlassen, da InnoDB aufgrund seines MVCC-Mechanismus mehrere Versionen derselben Daten beibehält. Siehe Abschnitt 14.5.12, „InnoDB Multi-Versioning“.


quelle
5

Sie können die Tabelle neu indizieren und sogar verkleinern. Wenn Sie jedoch eine solche festplattenbasierte Wartung verzögern möchten, sollten Sie zumindest die Indexstatistik neu berechnen.

Ohne Neuberechnung der Indexstatistik trifft das MySQL Query Optimizer möglicherweise schlechte Entscheidungen für EXPLAIN-Abfragepläne. Dies könnte sich nachteilig auf SELECTs auswirken, wenn die Statistiken für nicht vorhandene Daten noch vorhanden sind. Dies gilt sowohl für MyISAM als auch für InnoDB.

Sie müssen die Tabelle nicht verkleinern, um die Indexstatistik zu berechnen, obwohl dies für die Gesamtleistung besser ist.

Um Statistiken für alle Indizes in einer Tabelle zu berechnen, würden Sie ausführen

ANALYZE TABLE tablename;

Du könntest das jede Nacht tun. Es wird nicht versucht, Daten zu defragmentieren oder zu verkleinern. Sie könnten das wahrscheinlich einmal pro Woche tun, indem Sie laufen OPTIMIZE TABLE tablename;. Dies erledigt dies auch ANALYZE TABLE tablename;für Sie nach dem Verkleinern der physischen Datei der Tabelle ( .ibdfür InnoDB oder .MYIfür MyISAM) oder.

RolandoMySQLDBA
quelle
3

OPTIMIZE TABLE wird in InnoDB fast nie benötigt.

LÖSCHEN Sie Datensätze basierend auf dem Alter? In diesem Fall können Sie das "Massenlöschen" mithilfe von PARTITIONING und DROP PARTITION im Wesentlichen kostenlos machen. Weitere Details hier: http://mysql.rjweb.org/doc.php/partitionmaint

Rick James
quelle