Ist ein varchar 2 effizienter als ein varchar 255?

9

Ich benutze Django und setze mein CharField ( max_length = 255 ), obwohl ich nur ungefähr 5 Zeichen verwenden möchte. Ist das weniger effizient? Ich habe gelesen, dass es mit Varchar nicht wirklich wichtig ist, aber dann lesen Sie, dass es Speicherplatz auf der Festplatte spart, um nur das zu spezifizieren, was Sie brauchen.

    
orokusaki 13.01.2010, 08:27
quelle

5 Antworten

12

Im Allgemeinen benötigt varchar (255) so viel Speicher wie varchar (1). In jedem Fall speichert die Tabelle etwas wie einen Zeiger in einer Zeichenkettentabelle und eine Länge. Z.B. 4 Byte Offset + 1 Byte Größe = 5 Byte pro Zeile, nur für Overhead.

Der eigentliche Inhalt liegt natürlich in der Zeichenkettentabelle, die nur so lang ist wie die Zeichenkette, die darin gespeichert ist. Wenn Sie also einen 5-stelligen Namen in einem varchar (255) -Feld speichern, werden nur 5 Overhead-Bytes und 5 Content-Bytes = 10 Bytes verwendet.

Bei Verwendung eines varchar (10) -Feldes wird genau der gleiche Betrag verwendet, aber nur Strings, die länger als 10 Byte sind, abgeschnitten.

Natürlich hängen die spezifischen Zahlen von der Implementierung der Speicher-Engine ab.

    
Alex Budovski 13.01.2010, 08:37
quelle
3

Ein varchar nimmt nicht mehr Platz in Anspruch als die Zeichenfolge, die Sie darin speichern, abgesehen von Overhead zum Speichern der Stringlänge :

%Vor%

Wenn Sie jedoch tatsächlich nur 5 Zeichen benötigen, sollten Sie char (5) verwenden, wenn in der Tabelle keine anderen Spalten mit variabler Breite vorhanden sind (d. h. Varchare, Text oder Blobs). Dann haben Sie einen Datensatz fester Länge, der einige Leistungsvorteile aufweist :

  

Für MyISAM-Tabellen, die sich ändern   häufig sollten Sie versuchen zu vermeiden   alle Spalten variabler Länge (VARCHAR,   BLOB und TEXT). Die Tabelle verwendet   dynamisches Zeilenformat, wenn es gerade enthält   eine einzige Spalte mit variabler Länge. Sehen   Kapitel 13, Speicher-Engines.

    
Paul Dixon 13.01.2010 09:29
quelle
2

Ein Vorbehalt bei der Verwendung von char anstelle von varchar besteht darin, dass der Zeichensatz den Raum beeinflusst, der zugewiesen werden muss. Wenn zum Beispiel der Zeichensatz für diese Spalte utf8 ist, ist es möglich, dass 3 Bytes benötigt werden, um ein einzelnes Zeichen zu speichern.

Da eine Char-Spalte eine feste Größenzuordnung ergibt, unabhängig davon, was gespeichert ist, muss die Datenbank den schlimmsten Fall berücksichtigen. Daher muss MySQL immer 15 Bytes pro Zeile für diese char (5) -Spalte reservieren, selbst wenn Sie tatsächlich nur 5 Einzelbyte-Zeichen in jeder Zeile speichern.

Ein varchar verwendet genau das, was für jede Zeile benötigt wird, so wie sie gespeichert ist, so dass die gleichen 5 Einzelbyte-Zeichen nur 6 oder 7 Bytes belegen. Das oder die zusätzlichen Bytes dienen zum Verfolgen der tatsächlichen Länge. Für einen Varchar mit einer Breite von bis zu 255 in einem Single-Byte-Zeichensatz muss MySQL nur 1 Byte zuweisen, um die tatsächliche Breite zu speichern. Ein Varchar der Breite 256 bis 65.535 benötigt 2 Byte, um die Länge zu speichern, unter der Annahme eines einzelnen Byte-Zeichensatzes.

Da ein utf8 varchar (255) 255 * 3 Bytes Speicherplatz benötigt, muss MySQL 2 Bytes zum Speichern der Länge zuweisen. Ein Großteil dieser Informationen ist in den MySQL-Dokumenten hier enthalten.

Obwohl Sie eine Breite von 65.535 angeben können, beträgt die maximale effektive Größe in Bytes 65.532. Abhängig vom Zeichensatz und den Zeichen, die Sie speichern, können Sie jedoch maximal viele weniger Multibyte-Zeichen speichern.

Wie Paul jedoch betont, möchten Sie vielleicht immer noch ein Char verwenden, wenn dies der gesamten Reihe eine feste Breite geben würde. Unter anderem können bestimmte Suchvorgänge wegen des festen Versatzes schneller sein (z. B. die ersten 1000 Zeilen überspringen).

Es gibt auch Leistungsprobleme, die bei Aktualisierungen der Spalte berücksichtigt werden müssen. Wenn Sie ein Zeichen (5) haben und mit 1 Zeichen beginnen und dann den Wert auf 5 Zeichen aktualisieren, kann die Zeile an der richtigen Stelle aktualisiert werden. Bei einem Varchar muss die gesamte Zeile je nach Implementierung der Speicher-Engine möglicherweise an einem neuen Speicherort neu geschrieben werden.

Wenn MySQL schließlich eine speicherinterne temporäre Tabelle erstellen muss, um eine Ergebnismenge aus Ihrer persistenten Tabelle zu sortieren, verwendet es Datensätze fester Länge. Es weist also viel Speicherplatz für diese übergroßen Varchar-Spalten zu, als Sie vielleicht gedacht haben. Dies wird in den MySQL-Dokumenten für Speicher-Engine-Tabellen behandelt. Ich glaube, MySQL tut dies auch für festplattenbasierte Sortierungen.

    
Robert Stewart 29.01.2010 08:36
quelle
1

Der Platz auf der Festplatte ist billig, aber der Platz im CPU-Cache ist teuer. Sie können mehr kleinere Felder als größere Felder anpassen.

    
Ignacio Vazquez-Abrams 13.01.2010 08:29
quelle
0

Verwenden Sie nicht unnötig viel Platz, sondern nutzen Sie den Speicherplatz, der Ihnen nicht nur mehr Speicherplatz bietet, sondern auch eine schnelle Ausführungsgeschwindigkeit, da nicht alle Zeichen gelesen werden müssen. Wenn Sie varchar (255) zuweisen und Text 'abc' hinzufügen, liest es Zeichen 'a', 'b', 'c' und andere als Leerzeichen.

Verwenden Sie also immer den von Ihnen benötigten Platz, anstatt den maximalen Platz zu behalten.

    
Shivkant 13.01.2010 09:22
quelle