2010-12-01 9 views
18

Mögliche Duplizieren:
Importance of varchar length in MySQL tableIst VARCHAR-Größenbeschränkung von Bedeutung?

Wenn VARCHAR verwenden (vorausgesetzt, dies ist die Art für eine kurze Zeichenfolge richtigen Daten ist) ist die Größe eine Rolle? Wenn ich es auf 20 Zeichen setze, wird das weniger Platz einnehmen oder schneller sein als 255 Zeichen?

+0

Es gibt einen tollen Kommentar in dem oben genannten Artikel. "Es gibt einen möglichen Leistungseinfluss: In MySQL speichern temporäre Tabellen und MEMORY-Tabellen eine VARCHAR-Spalte als Spalte mit fester Länge, die auf die maximale Länge aufgefüllt wird. Wenn Sie VARCHAR-Spalten entwerfen, die viel größer sind als die größte benötigte Größe wird mehr Speicher verbrauchen als Sie selbst. Dies wirkt sich auf Cache-Effizienz, Sortiergeschwindigkeit usw. aus. " – Riedsio

Antwort

10

Im Allgemeinen, für ein VARCHAR-Feld, die Menge der Daten in jedem Feld bestimmt seinen Fußabdruck auf der Festplatte und nicht die maximale Größe (im Gegensatz zu einem CHAR-Feld, das immer hat der gleiche Fußabdruck).

Es gibt eine Obergrenze für die Gesamtdaten, die in allen Feldern eines Index von 900 Byte gespeichert werden (900 byte index size limit in character length).

Je größer Sie das Feld machen, desto wahrscheinlicher werden die Leute versuchen, für andere Zwecke als das, was Sie beabsichtigten - und desto größer die Bildschirmfläche benötigt, um den Wert zu zeigen - so seine gute Praxis zu versuchen, die auszuwählen richtig Größe, anstatt davon auszugehen, dass wenn Sie es so groß wie möglich machen, es Ihnen sparen wird, das Design erneut zu besuchen.

0

Wenn Sie 20 einstellen, werden nur die ersten 20 Zeichen gespeichert. Also ja, es braucht weniger Platz als 255 Zeichen :).

2

Dies hat keine Auswirkungen auf die Leistung. In diesem Fall trägt die Einschränkung lediglich dazu bei, die Datenintegrität sicherzustellen.

+3

Es kann sich massiv auf die Leistung auswirken. Wenn Sie nur eine VarChar-Spalte (oder Text oder eine andere Spalte mit variabler Breite) verwenden, verwendet MySQL ein Zeilenformat mit dynamischer Breite. Um einen Tabellenscan durchzuführen, muss er daher jede Zeile sequenziell lesen, um die nächste zu finden. Der Unterschied zwischen dem Überspringen von einigen hundert Bytes und einigen tausend Bytes (wegen mehrfacher überlanger VarChars) kann sehr bedeutsam sein (meistens abhängig von der zugrundeliegenden Laufwerksstruktur und Block-Geräten). Aber kurz gesagt, es kann absolut Leistung (vor allem für große Tabellen mit GB Daten werden Sie es jedoch bemerken) ... – ircmaxell

1

This Antwort sollte Ihnen helfen.

+0

Es wird nicht unbedingt, denn diese Antwort spricht nur über SQL Server, nicht MySQL. Sie können VARCHAR anders implementieren. – BoltClock

+0

Er verwendet MySQL noch MSSQL. – Pentium10

5

Die tatsächlichen Unterschiede sind:

  • TINYTEXT und andere Textfelder sind getrennt von In-Memory-Zeile innerhalb MySQL Heap gespeichert, während VARCHAR() Felder 64k Grenze aufaddieren (so können Sie mehr als 64k in TINYTEXTs, während Sie nicht mit VARCHAR).

  • TINYTEXT und andere 'blob-artige' Felder erzwingen, dass der SQL-Layer (MySQL) temporäre Tabellen auf der Festplatte verwendet, während VARCHAR immer noch im Speicher sortiert ist (obwohl er in CHAR konvertiert wird) für die volle Breite).

  • InnoDB intern kümmert es nicht wirklich, ob es sich um winzigen Text oder Varchar handelt. Es ist sehr einfach zu überprüfen, zwei Tabellen zu erstellen, eine mit VARCHAR (255), eine andere mit TINYINT, und einen Datensatz in beide einzufügen. Sie nehmen beide eine einzelne 16k-Seite - wohingegen, wenn Überlaufseiten verwendet werden, die TINYTEXT-Tabelle als mindestens 32k in 'SHOW TABLE STATUS' erscheinen sollte.

Ich ziehe es in der Regel VARCHAR (255) - sie nicht zu viel bewirken Heapfragmentierung für einreihige und kann als einzelnes 64k Objekt im Speicher innerhalb MySQL behandelt werden. Bei InnoDB sind die Größenunterschiede vernachlässigbar.

0

Die required storage space for VARCHAR ist wie folgt:

VARCHAR(L), VARBINARY(L) - L + 1 Bytes, wenn Spaltenwerte erfordern 0 - 255 Bytes, L + 2 Bytes, wenn Werte können mehr als 255 Bytes erfordern

So VARCHAR erfordert nur den Speicherplatz für die Zeichenfolge plus ein oder zwei zusätzliche Bytes für die Länge der Zeichenfolge.

9

Ja, ist wichtig, wenn Sie mehrere Spalten indizieren.

Präfixe können bis zu 1000 Byte lang sein (767 Byte für InnoDB-Tabellen). Beachten Sie, dass Präfixgrenzen in Bytes gemessen werden, während die Präfixlänge in CREATE TABLE-Anweisungen als Anzahl von Zeichen interpretiert wird. Achten Sie darauf, dies zu berücksichtigen, wenn Sie eine Präfixlänge für eine Spalte angeben, die einen Multibyte-Zeichensatz verwendet.

Quelle: http://dev.mysql.com/doc/refman/5.0/en/column-indexes.html

In einer latin1 Sortierung, können Sie nur 3 Spalten von varchar(255) angeben.
Während ohne richtigen Index, wird es Verlangsamungs Abfragegeschwindigkeit

In Bezug auf die Lagerung, es ist nicht Unterschied macht, geben Sie bis zu 50 Spalten für varchar(20)

In-direkt,
als variable-length strings

4

In der Dokumentation von MySQL varchar für stehen: http://dev.mysql.com/doc/refman/5.0/en/char.html

Sie haben eine Tabelle, die die Bytes eines VARCHAR (4) angibt (gegenüber einem CHAR (4)).

Ein einfaches VARCHAR (4) ohne Zeichenfolge, nur 1 Byte. Dann ist ein einfacher VARCHAR (255) ohne Zeichenfolge 1 Byte. Ein VARCHAR (4) mit 'ab' ist 3 Bytes und ein VARCHAR (255) mit 'ab' ist 3 Bytes. Es ist das gleiche, aber mit der Länge Grenze :)