EDIT: Gilt nicht ohne file_per_table, Mark ist genau dort.
Was passiert ist, wenn MySQL einmal Platz braucht, wird es nicht zurück geben. Wenn Sie 500 Zeilen löschen und dann sofort 500 einfügen, muss der Speicherplatz nicht mehr an das Dateisystem zurückgegeben und dann erneut angefordert werden. Es ist eine Optimierung, um Dateisystem-Overhead zu vermeiden, und es funktioniert gut, wenn Sie kleine Bits löschen.
Wenn Sie eine große Menge löschen, wird es sehr lange dauern, bis Sie den gesamten Speicherplatz wieder verwenden, was ärgerlich sein kann. Dies kann auf zwei Arten behoben werden: Löschen der Tabelle und Neuladen des Inhalts oder Optimieren der Tabelle (die im Prinzip die Tabelle intern neu lädt).
Alles, was Sie tun müssen, um Raum aus einer Tabelle zurück zu bekommen ist:
OPTIMIZE TABLE my_big_table;
Beachten Sie, dass dies eine Weile dauern kann, es ist nicht ein in der Nähe von Instant-Betrieb. Im Grunde planen Sie eine gewisse Ausfallzeit. Wenn Ihre Tische nur ein paar Gigs sind, sollte es nicht zu lange dauern (wahrscheinlich ein paar Minuten). Dies erstellt auch die Indizes neu und führt einige andere Aufgaben aus.
Sie können mehr über optimieren on the MySQL site. Hier ist es Rat:
OPTIMIZE TABLE verwendet werden sollten, wenn Sie einen großen Teil einer Tabelle gelöscht haben oder wenn Sie viele Änderungen an einer Tabelle mit Zeilen variabler Länge (Tabellen gemacht, die VARCHAR haben, VARBINARY, BLOB oder TEXT-Spalten). Gelöschte Zeilen werden in einer verknüpften Liste verwaltet, und nachfolgende INSERT-Operationen verwenden alte Zeilenpositionen erneut. Sie können OPTIMIZE TABLE verwenden, um den unbenutzten Speicherplatz zurückzugewinnen und die Datendatei zu defragmentieren.
@Gaurav - Sobald die Tabelle gelöscht wurde, wird mysql auch die physische Datei entfernen, logischerweise ist der Speicherplatz frei. Was ist dein Problem/deine Absicht? – ajreal
Ich denke nicht, dass das der Fall ist, weil ich eine Tabelle von 1 GB fallen gelassen habe und ich bin ziemlich sicher, dass ich den Speicherplatz nicht zurück habe? Selbst wenn ich es täte, wie würdest du das machen, wenn du Spalten fallen lässt? – Gaurav
@Gaurav - Hast du 'du -shc YOUR_DATABASE_DIRECTORY' vorher und nachher gemacht? Sie können 'optimize table' für das Löschen der Spalte verwenden, obwohl mysql wieder automatisch den Speicherplatz für das Tabellenschema-Update freigibt. – ajreal