Auswirkungen des Speicherplatzes auf die Einstellung des MySQL-Spaltenwerts auf NULL anstelle von 0 oder ''

8

Ich versuche zu verstehen, wie Spalten, die in Bezug auf Speicherplatz und index-performance meist leer sind, am besten leer sind. Gibt es einen Unterschied zwischen dem Einfügen aller leeren Stellen NULL vs '' (für Varchar / Text) vs 0 (für Int).

Danke.

    
Noam 03.11.2012, 09:28
quelle

3 Antworten

10

Nein, mit NULL wird nicht weniger Platz belegt als mit einem leeren Feld VARCHAR oder INT . In der Tat kann es mehr Platz einnehmen. Hier ist warum:

A VARCHAR wird als Größe + Wert gespeichert. Die Anzahl der Bytes, die für die Größe verwendet werden, hängt vom maximalen Speicher des VARCHAR ab. VARCHAR(255) benötigt ein Byte, VARCHAR(65536) benötigt zwei Bytes und so weiter.

So dass die VARCHAR(255) Spalte ein Byte einnimmt, auch wenn Sie eine leere Zeichenfolge speichern. Die folgende Tabelle würde mindestens ein Byte pro Zeile benötigen (zuzüglich eines anderen möglichen Aufwands je nach Speichermodul).

%Vor%

Um NULL -Werte zu speichern, verwendet MySQL für jede Zeile eine Bitmaske. Bis zu 8 Nullwertspalten können pro Byte gespeichert werden. Also, wenn du einen Tisch wie diesen hast:

%Vor%

Wäre mindestens zwei Bytes pro Zeile erforderlich. Speichern von NULL setzt nur das Bit, es ist bereits reserviert, ob Sie es verwenden oder nicht. Das Byte für die Größe VARCHAR wird weiterhin für jede Zeile verwendet, auch wenn die Spalte auf NULL gesetzt ist.

    
Gavin Towey 03.11.2012, 10:00
quelle
0

Kommt darauf an.

Wenn Sie eine Tabelle mit fester Breite haben (keine VARCHAR , VARBINARY , BLOB oder TEXT ), wird dies wahrscheinlich keinen Unterschied machen.

In einer Tabelle mit variabler Breite verbraucht ein NULL wahrscheinlich so viel Speicherplatz wie ein leeres VARCHAR .

Wenn Sie fast alle Werte NULL haben und nur sehr wenige Daten enthalten, können Sie eine separate Tabelle erstellen, der Sie sich anschließen.

Nehmen wir an, Sie haben eine Liste von Personen, bei denen nur wenige von ihnen das Geburtsdatum haben.

Also statt

%Vor%

könntest du

machen %Vor%

und Abfrage der Daten mit einem LINKEN JOIN.

Wenn es Anwendungen gibt, die auf die Tabelle im alten Format zugreifen müssen, könnten Sie eine Ansicht definieren.

    
glglgl 03.11.2012 10:03
quelle
0

Die einfache Antwort ist vielleicht (obwohl es nicht wichtig sein sollte), Nullen können weniger Speicherplatz beanspruchen, obwohl die Platzeinsparung wahrscheinlich winzig sein wird (obwohl sich selbst kleine Einsparungen summieren).
Wenn der Speicherplatz nicht sehr eng ist, würde ich mir keine Gedanken darüber machen (Speicherplatz ist viel billiger als Programmierer Zeit).
Null und 0 (oder '') sind ebenfalls semantisch verschieden und sollten daher nicht synonym verwendet werden, schon gar nicht für einen theoretischen (oder sehr kleinen) Leistungsgewinn.

Siehe Diese Frage für weitere Details.

Ich glaube nicht, dass die Indexierung stark beeinflusst wird, es könnte eine leichte Geschwindigkeitsverbesserung geben.
Weitere Informationen finden Sie diese Frage .

Diese Frage befasst sich speziell mit MySQL und null Leistung.

    
SteB 03.11.2012 09:41
quelle

Tags und Links