Das Ganze ist auch SQL-mäßig möglich.
Ich denke der Befehl lautet optimize table oder so ähnlich.
Mit myisamchk wird man bei Innodb's nicht weit kommen, obwohl man dort die Fragmentierung am deutlichsten spürt
Ich hatte mal mit einer Innodb-Datenbank in MySQL zu tun, die ca. 1 GB an Nutzdaten beinhaltete.
Das Datenbank-File im Dateisystem war aber ca. 15 GB groß. Aufgrund dauernder inserts und deletes ist es immer nur gewachsen. Die Nutzdaten der Datenbank lagen irgendwo verstreut innerhalb dieses Files herum. Inzwischen waren "Löcher" mit gelöschten Daten.
Bei den Operationen auf diese DB konnte sich MySQL die gewünschten Daten quer aus dieser großen Daten von den verschiedensten Stellen zusammenkratzen.
Performant war das nicht mehr gerade, seltsamerweise vor allem, wenn man viele Datensätze mit einem Statement löschte.