2009-07-20 12 views
54

Wie speichert MySQL ein Varcharfeld? Kann ich davon ausgehen, dass die folgenden Muster sinnvolle Speichergrößen dar:Was sind die optimalen Varchar-Größen für MySQL?

1,2,4,8,16,32,64,128,255 (max)

eine Klärung über Beispiel. Sagen wir, ich habe ein varchar Feld von 20 Zeichen. Legt MySQL bei der Erstellung dieses Felds grundsätzlich Platz für 32 Bytes frei (nicht sicher, ob es Bytes sind oder nicht), aber nur 20 eingeben?

Ich denke, ich bin besorgt über die Optimierung des Speicherplatzes für eine massive Tabelle.

+7

Ich wollte darauf hinweisen, dass ab varlar ab 5.0.3 varchar aufwärts von 65.535 sein kann – joshtronic

Antwort

46

Um die Frage zu beantworten, verwendet auf der Festplatte MySql 1 + die Größe, die im Feld verwendet wird, um die Daten zu speichern (wenn also die Spalte varchar (45) deklariert wurde und das Feld "FooBar" war, würde 7 verwendet) Bytes auf der Festplatte, außer natürlich, wo Sie einen Multibyte-Zeichensatz verwenden, wo es 14 Bytes verwenden würde). Also, wie auch immer Sie Ihre Spalten deklarieren, es macht keinen Unterschied auf dem Speicherende (Sie haben gesagt, dass Sie sich Sorgen über die Festplattenoptimierung für eine massive Tabelle machen). Es macht jedoch einen Unterschied in den Abfragen, da VARCHARs in CHARs konvertiert werden, wenn MySql eine temporäre Tabelle erstellt (SORT, ORDER usw.) und je mehr Datensätze Sie in eine einzelne Seite einfügen können, desto weniger Speicher und schneller werden Ihre Tabellen-Scans Sein.

+0

hm? Also, auf Multibyte-Zeichensatz ist es ((Größe) + 2)? – andyk

+3

Nein, auf Multibyte ist es (Größe * 2) + 1. –

+2

@Kris: Ich glaube, es kann auch sein (Größe * 3) + 1 oder sogar (Größe * 4) + 1, nein? –

22

MySQL speichert ein varchar-Feld als Datensatz mit variabler Länge, wobei entweder ein Ein-Byte- oder ein Zwei-Byte-Präfix die Datensatzgröße angibt.

Ein Muster von Speichergrößen macht keinen wirklichen Unterschied, wie MySQL beim Umgang mit Datensatzspeicher mit variabler Länge funktioniert. Die in einer varchar (x) -Deklaration angegebene Länge bestimmt einfach die maximale Länge der Daten, die gespeichert werden können. Grundsätzlich ist ein varchar (16) nicht anders als ein varchar (128).

This manual page hat eine detailliertere Erklärung.

Edit: In Bezug auf Ihre aktualisierte Frage ist die Antwort immer noch die gleiche. Ein varchar-Feld belegt nur so viel Speicherplatz auf der Festplatte wie die Daten, die Sie darin speichern (plus ein oder zwei Byte Overhead). Es spielt also keine Rolle, ob Sie ein varchar (16) oder ein varchar (128) haben. Wenn Sie eine 10-stellige Zeichenfolge darin speichern, werden Sie nur 10 Bytes (plus 1 oder 2) Speicherplatz belegen .

+30

Eigentlich Zugriff weise macht es einen großen Unterschied, seit wenn MySql erstellt das Ergebnis im Speicher setzt es in eine Matrix, also wenn Sie Das größte Feld besteht aus 16 Zeichen, aber das Feld ist als 128 Zeichen definiert. Sie müssen für jede Zeile zusätzliche 112 Zeichen zuweisen. Dies verschwendet viel eine Erinnerung. –

+2

Nicht nur müssen Sie für jede Zeile im Speicher zusätzliche 112 Zeichen zuweisen, aber Sie werden sehr viel mehr L1 Cache-Fehler haben, wenn jede Zeile iteriert wird. Dies wird mit einem VARCHAR (16) -Säulentyp verglichen, bei dem Sie viel mehr Zeilen mit dieser Spalte in den Hochgeschwindigkeits-Cache unter der Haube schieben können. –