2010-12-20 11 views
0

Ich habe eine Tabelle mit ziemlich vielen Einträgen. Ich brauche eine zusätzliche Spalte mit einem Integer-Wert oder Null. Die Sache ist, dass nur sehr wenige Zeilen dieses Feld gefüllt haben.Mysql Spalte mit Nullwerten - was sind die Platzanforderungen?

Also ich frage mich, ob es besser ist, eine separate Tabelle zu erstellen, wo ich die Einträge in einer 1: 1-Beziehung verknüpfen.

Ich weiß, dass ein Integer-Eintrag 4 Bytes in MySQL/Myisam dauert. Wenn die Spalte so eingestellt ist, dass Nullwerte zulässig sind und nur 100 von 100 000 Zeilen das Feld ausgefüllt haben, wird der Rest für jeden Nullwert immer noch 4 Byte verbrauchen?

Oder ist mysql intelligent genug, um den Wert dort zu setzen, wo es bevölkert ist, und einfach alles als null betrachten, wo nichts gesetzt ist?

Antwort

1

Dies hängt vom ROW_FORMAT-Wert ab, den Sie beim Erstellen Ihrer Tabelle angeben.

Vor der Version 5.0.3 ist das Standardformat auf "REDUNDANT" festgelegt: Jedes Feld mit fester Länge verwendet dasselbe Leerzeichen, auch wenn der Wert NULL ist.

Ab Version 5.0.3 wird der Wert auf "COMPACT" gesetzt: NULL-Werte verwenden niemals Speicherplatz in Ihrer Datenbank.

Sie können eine ALTER TABLE tun um sicherzustellen, dass das richtige Format verwenden:

ALTER TABLE ... ROW_FORMAT=COMPACT 

Weitere Details hier: http://dev.mysql.com/doc/refman/5.1/en/data-size.html

+0

Wie konnte es möglich sein, Null Raum zu verwenden, Nullwerte speichern Es muss? etwas kostet, ist es nicht möglich, sich an die Werte zu erinnern –

+0

@nate c ... naja, nur die Daten speichern und alle Daten, die keinen entsprechenden Teil haben, sind implizit null –

+0

Es gibt nichts in diesem Link, der sagt, wie Nullen gespeichert werden Ich speichere 6 Spalten von Ints, wobei die Werte 33,44,66 sind. Drei Spalten sind implizit Null. Welche 3 Spalten sind das? Das ist null Speicher. Zumindest braucht man ein Bitfeld um zu sagen, welche Spalten da sind und welche nicht. –

0

Soweit ich verstehe, sobald Sie ein Feld als int deklarieren, werden 4 Bytes dafür reserviert. Für 100.000 Zeilen sehen Sie also ~ 400 KB Speicherplatz.

Wenn Platz eine Einschränkung ist, wird separate Tabelle besser sein. Auf der anderen Seite, wenn Leistung ein Kriterium ist, dann müssen Sie berücksichtigen, wie oft dieses Feld abgefragt wird und ob es auf Existenz oder Nicht-Existenz überprüft wird. In beiden Fällen benötigen Sie einen Beitritt. Wenn Sie überprüfen möchten, ob das Feld festgelegt ist, können Sie den inneren Join verwenden, der langsamer ist als die Abfrage einer einzelnen Tabelle. Wenn Sie auf Nicht-Existenz prüfen möchten, benötigen Sie einen linken/rechten äußeren Join, der langsamer als der innere Join ist.

0

Es wird Bitfelder verwenden nulls zu speichern, so dass es weniger benötigen als ein Byte. Aber selbst wenn es so wäre - wer kümmert sich, wenn Sie 3,5" Floppy-Discs werden mit Ihrem Backend speichern in ;-)

NULL in MySQL (Performance & Storage)