Ich habe untersucht, wie nur fragmentierte Tabellen in MySQL optimiert werden können, und diesen Beitrag zur Optimierung von Tabellen gelesen . Grundsätzlich führt es eine Abfrage für die Datenbank information_schema für jede Tabelle mit durch data_free > 0
und erstellt eine SQL-Anweisung OPTIMIZE
nur für diese Tabellen. Ich habe diese Abfrage ausgeführt und 148 Tabellen zur Optimierung identifiziert. Alle identifizierten Tabellen sind InnoDB-Tabellen. Nachdem ich das resultierende Optimierungs-SQL-Skript ausgeführt hatte, führte ich das ursprüngliche Skript erneut aus, um fragmentierte Tabellen zu identifizieren, und es gab im ersten Durchgang genau dieselben Tabellen zurück.
Ich habe widersprüchliche Beiträge zu den InnoDB-Tabellen und dem OPTIMIZE
Befehl gesehen. Einige sagen, dass OPTIMIZE
dies mit InnoDB-Tabellen nicht funktioniert und dass Sie ausgeführt werden müssen ALTER TABLE table_name ENGINE=INNODB
. Andere sagen, dass OPTIMIZE
der ALTER TABLE
Befehl tatsächlich ausgeführt wird, wenn er für InnoDB-Tabellen ausgeführt wird. In diesem Sinne habe ich den ALTER TABLE
Befehl für eine der InnoDB-Tabellen ausgeführt, die als fragmentiert ( data_free > 0
) identifiziert wurden, und festgestellt, dass sich die data_free
danach nicht geändert hat. Es ist immer noch größer als 0. Ich habe auch MySQL neu gestartet und es nur überprüft, um die gleichen Ergebnisse zu finden.
Jetzt haben wir mehrere Server in unserer Organisation, auf denen MySQL 5.5.29 ausgeführt wird, und ich habe eine Abfrage für alle ausgeführt, um InnoDB-Tabellen zu identifizieren, DATA_FREE=0 or NULL
und es wurden keine zurückgegeben. Sie sind alle größer als Null.
Ich habe den OPTIMIZE
Befehl auch für einige MyISAM
Tabellen ausgeführt, DATA_FREE
die größer als Null waren, und danach überprüft, ob er Null war.
Kann mir jemand etwas Licht ins Dunkel bringen? Was ist die richtige Methode, um Fragmentierung aus InnoDB-Tabellen zu entfernen? Was ist die richtige Methode, um fragmentierte InnoDB-Tabellen zu bestimmen?
Vielen Dank
quelle
innodb_file_per_table
, wird auch für jede Tabelle im gemeinsam genutzten Tabellenbereich der gleiche Wert angezeigt.