it-swarm.com.de

Was ist der Unterschied zwischen den Datentypen MySQL VARCHAR und TEXT?

Gibt es nach Version 5.0.3 (die es VARCHAR ermöglichte, 65.535 Byte zu sein und das Abschneiden von nachgestellten Leerzeichen zu beenden) einen wesentlichen Unterschied zwischen diesen beiden Datentypen?

Ich habe die Liste der Unterschiede gelesen und die einzigen zwei bemerkenswerten sind:

Für Indizes für BLOB- und TEXT-Spalten müssen Sie eine Indexpräfixlänge angeben. Für CHAR und VARCHAR ist eine Präfixlänge optional. Siehe Abschnitt 7.5.1, „Spaltenindizes“.

und

BLOB- und TEXT-Spalten dürfen keine DEFAULT-Werte haben.

Warum sollten Sie den TEXT-Datentyp aufgrund dieser beiden Einschränkungen über varchar (65535) verwenden? Gibt es Leistungsauswirkungen von einem zum anderen?

19
Derek Downey

geteilt verknüpft mit einigen Informationen, die das Grundproblem erklären (es gibt Leistungsunterschiede), aber es ist nicht einfach genug zu sagen, dass einer immer besser ist als der andere. (Andernfalls gibt es keinen Grund, beides zu haben.) In MyISM ist die maximale Größe von 64 KB für VARCHAR nicht pro Feld, sondern pro Datensatz.

Grundsätzlich gibt es 4 Möglichkeiten, Zeichenfolgen in Datenbankeinträgen zu speichern:

  1. feste Länge
  2. Zeichenfolgen im C-Stil (gekennzeichnet mit einem NULL-Zeichen oder einem ähnlichen Zeichen am Ende der Zeichenfolge)
  3. Zeichenfolgen im Pascal-Stil (einige Bytes zur Angabe der Länge, dann die Zeichenfolge)
  4. Zeiger (speichern Sie die Zeichenfolge woanders)

MyISM verwendet für VARCHAR etwas Ähnliches wie # 3 und für TEXT einen hybriden Ansatz, bei dem der Anfang der Zeichenfolge im Datensatz und der Rest der Zeichenfolge an einer anderen Stelle gespeichert werden. InnoDB ähnelt VARCHAR, speichert jedoch das gesamte TEXT-Feld außerhalb des Datensatzes.

Mit 1 & 4 ist das Material im Datensatz immer gleich lang, sodass es einfacher ist, es zu überspringen, wenn Sie den String nicht benötigen, aber danach Material benötigen. Sowohl # 2 als auch # 3 sind nicht schlecht für kurze Saiten ... # 2 muss weiter nach dem Marker suchen, während # 3 weitermachen kann ... wenn die Saiten länger werden, wird # 2 für diese spezielle Verwendung schlechter Fall.

Wenn Sie die Zeichenfolge tatsächlich lesen müssen, ist # 4 langsamer, da Sie den Datensatz lesen müssen, und dann die Zeichenfolge, die möglicherweise an anderer Stelle auf der Festplatte gespeichert ist, je nachdem, wie diese Datenbank damit umgeht. # 1 ist immer ziemlich einfach, und wieder stoßen Sie auf ähnliche Probleme, bei denen # 2 umso schlechter wird, je länger die Saite ist, während # 3 bei sehr kleinen Saiten etwas schlechter als # 2 ist, aber besser, wenn es länger wird.

Dann gibt es Speicheranforderungen ... # 1 ist immer eine feste Länge, daher kann es zu Blähungen kommen, wenn die meisten Zeichenfolgen nicht die maximale Länge haben. # 2 hat 1 zusätzliches Byte; # 3 hat normalerweise 2 zusätzliche Bytes, wenn die maximale Länge = 255 ist, 4 zusätzliche Bytes, wenn eine maximale Länge von 64 KB vorhanden ist. # 4 hat die Zeigerlänge plus die Regeln für # 3 in der Regel.

Für die spezifischen Implementierungen in MySQL 5.1 ist docs for MyISM state :

  • Unterstützung für einen echten VARCHAR-Typ; Eine VARCHAR-Spalte beginnt mit einer Länge, die in einem oder zwei Bytes gespeichert ist.
  • Tabellen mit VARCHAR-Spalten können eine feste oder dynamische Zeilenlänge haben.
  • Die Summe der Längen der Spalten VARCHAR und CHAR in einer Tabelle kann bis zu 64 KB betragen.

Während für InnoDB :

  • Der Teil mit variabler Länge des Datensatzheaders enthält einen Bitvektor zum Anzeigen von NULL-Spalten. Wenn die Anzahl der Spalten im Index, die NULL sein können, N ist, belegt der Bitvektor CEILING (N/8) Bytes. (Wenn beispielsweise 9 bis 15 Spalten NULL sein können, verwendet der Bitvektor zwei Bytes.) Spalten, die NULL sind, belegen keinen anderen Speicherplatz als das Bit in diesem Vektor. Der Teil des Headers mit variabler Länge enthält auch die Längen von Spalten mit variabler Länge. Jede Länge benötigt ein oder zwei Bytes, abhängig von der maximalen Länge der Spalte. Wenn alle Spalten im Index NICHT NULL sind und eine feste Länge haben, enthält der Datensatzheader keinen Teil variabler Länge.
  • Für jedes Feld mit variabler Länge, das nicht NULL ist, enthält der Datensatzheader die Länge der Spalte in einem oder zwei Bytes. Zwei Bytes werden nur benötigt, wenn ein Teil der Spalte extern auf Überlaufseiten gespeichert ist oder die maximale Länge 255 Bytes und die tatsächliche Länge 127 Bytes überschreitet. Bei einer extern gespeicherten Spalte gibt die Zwei-Byte-Länge die Länge des intern gespeicherten Teils plus den 20-Byte-Zeiger auf den extern gespeicherten Teil an. Der interne Teil ist 768 Bytes, die Länge beträgt also 768 + 20. Der 20-Byte-Zeiger speichert die wahre Länge der Spalte.

...

wenn Sie sich nicht sicher sind, was für Ihre Anforderungen am besten ist, versuchen Sie, wie bei so vielen anderen Dingen beim Umgang mit Datenbanken, diese mit ähnlichen Daten und Verwendungszwecken zu vergleichen und zu sehen, wie sie sich verhalten.

13
Joe

Wenn ein SELECT eine temporäre Tabelle erstellen muss (z. B. um die Ergebnisse zu sortieren), erstellt es entweder eine MEMORY-Tabelle oder eine MyISAM-Tabelle. MEMORY ist effizienter. Es gibt Einschränkungen für MEMORY - eine besteht darin, TEXT und BLOB nicht zuzulassen. Daher läuft ein SELECT möglicherweise mit TEXT langsamer als VARCHAR.

2
Rick James