Ich hatte den Eindruck, dass die Einstellung eines int-Feldes auf vorzeichenbehaftet gegenüber vorzeichenlos keinen Platz spart. Heute habe ich einige Spalten auf vorzeichenlos gesetzt, da sie nie einen negativen Wert speichern, und eine Verringerung der Tabellengröße um 15 % festgestellt. Einige meiner Tabellen wurden nicht kleiner, als ich ihre int-Spalten auf vorzeichenlos gesetzt habe, einige Tabellen wurden erheblich kleiner. Hat jemand eine Erklärung dafür?
Antwort
Zu viele Anzeigen?@Frank Schmitt und @Kenny haben recht: Wenn Sie nur die Dateigröße vor und nach der Änderung des Datentyps beobachtet haben, sehen Sie einen anderen Effekt. Ganzzahlen mit Vorzeichen und Ganzzahlen ohne Vorzeichen belegen jeweils 4 Byte, keine der beiden ist platzsparender.
MySQL führt eine Tabellenumstrukturierung wenn Sie Spalten hinzufügen oder ändern, und unter einigen anderen Umständen. Das heißt, der Inhalt der Tabelle wird in eine neue Datei kopiert, und anschließend wird die alte Datei gelöscht und die neue Datei umbenannt.
Wenn die alte Datei aufgrund früherer LÖSCHUNGEN viel ungenutzten Speicherplatz hatte, würde sie auf der Festplatte größer erscheinen als die darin enthaltenen Daten. Ein genaueres Maß für den von Daten und Indizes belegten Platz erhalten Sie mit:
mysql> SHOW TABLE STATUS FROM mydatabasename LIKE 'mytablename'\G
En data_length
y index_length
In den Feldern dieses Status ist der erforderliche Platz angegeben. Ein weiteres Feld data_free
zeigt die Menge an Speicherplatz in der Datendatei, die die Fragmentierung darstellt, die (mehr oder weniger) zurückgewonnen werden sollte, wenn Sie eine ALTER TABLE durchführen.