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 > 0und erstellt eine SQL-Anweisung OPTIMIZEnur 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 OPTIMIZEBefehl gesehen. Einige sagen, dass OPTIMIZEdies mit InnoDB-Tabellen nicht funktioniert und dass Sie ausgeführt werden müssen ALTER TABLE table_name ENGINE=INNODB. Andere sagen, dass OPTIMIZEder ALTER TABLEBefehl tatsächlich ausgeführt wird, wenn er für InnoDB-Tabellen ausgeführt wird. In diesem Sinne habe ich den ALTER TABLEBefehl für eine der InnoDB-Tabellen ausgeführt, die als fragmentiert ( data_free > 0) identifiziert wurden, und festgestellt, dass sich die data_freedanach 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 NULLund es wurden keine zurückgegeben. Sie sind alle größer als Null.
Ich habe den OPTIMIZEBefehl auch für einige MyISAMTabellen ausgeführt, DATA_FREEdie 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
innodb_file_per_table, wird auch für jede Tabelle im gemeinsam genutzten Tabellenbereich der gleiche Wert angezeigt.