Gibt es nach Version 5.0.3 (die es VARCHAR ermöglichte, 65.535 Byte zu groß zu werden und keine nachgestellten Leerzeichen mehr zu kürzen) einen wesentlichen Unterschied zwischen diesen beiden Datentypen?
Ich habe die Liste der Unterschiede gelesen und die einzigen zwei 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 auch Abschnitt 7.5.1, „Spaltenindizes“.
und
BLOB- und TEXT-Spalten dürfen keine DEFAULT-Werte enthalten.
Warum sollten Sie den Datentyp TEXT aufgrund dieser beiden Einschränkungen über varchar (65535) verwenden? Gibt es Performance-Konsequenzen übereinander?
mysql
database-design
datatypes
Derek Downey
quelle
quelle
Antworten:
geteilt, verbunden mit einigen Informationen, die das Grundproblem erklären (es gibt Leistungsunterschiede), aber es ist nicht einfach genug zu sagen, dass man 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 vier Möglichkeiten, Zeichenfolgen in Datenbankeinträgen zu speichern:
MyISM verwendet für VARCHAR einen ähnlichen Ansatz wie # 3 und für TEXT einen Hybridansatz, bei dem der Anfang der Zeichenfolge im Datensatz und der Rest der Zeichenfolge an einer anderen Stelle gespeichert werden. InnoDB ist ähnlich wie VARCHAR, speichert jedoch das gesamte TEXT-Feld außerhalb des Datensatzes.
Bei 1 & 4 ist das Zeug in der Aufzeichnung immer gleich lang, so dass es einfacher ist, zu überspringen, wenn Sie die Zeichenfolge nicht benötigen, aber danach brauchen. Sowohl # 2 als auch # 3 sind nicht schlecht für kurze Saiten ... # 2 muss weiter nach dem Marker suchen, während # 3 weiterspringen 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. Lesen Sie dann die Zeichenfolge, die möglicherweise an anderer Stelle auf der Festplatte gespeichert ist, je nachdem, wie diese Datenbank damit umgeht. Nummer 1 ist immer ziemlich einfach, und wieder treten ähnliche Probleme auf, bei denen Nummer 2 umso schlechter wird, je länger die Saite ist, während Nummer 3 bei sehr kleinen Saiten etwas schlechter ist als Nummer 2, aber umso besser, je länger die Saite wird.
Dann gibt es Speicheranforderungen ... # 1 ist immer eine feste Länge, daher kann es zu Aufblä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 bei einer maximalen Länge von 255, 4 zusätzliche Bytes bei einer maximalen Länge von 64 KB. # 4 hat die Zeigerlänge plus die Regeln für # 3 in der Regel.
Für die spezifischen Implementierungen in MySQL 5.1 heißt es in den Dokumenten für MyISM :
Während für InnoDB :
...
Wenn Sie sich nicht sicher sind, was für Ihre Anforderungen am besten ist, sollten Sie, wie bei so vielen anderen Dingen im Umgang mit Datenbanken, versuchen, das Benchmarking mit ähnlichen Daten und Nutzungsdaten durchzuführen und deren Verhalten zu überprüfen.
quelle
LONGTEXT
undLONGBLOB
sind ein typisches Beispiel. Strings im C-Stil werden von MySQL nirgends verwendet (was mir bekannt ist). InnoDB verwendet einen hybriden Ansatz, der jedoch je nach Zeilengröße, Zeilenformat usw. komplexer ist. Das Speichern von Zeichenfolgen in "fester" Länge ist so gut wie nie ratsam, es sei denn, sie haben tatsächlich eine konstante Länge (country_code, zip_code usw.). . InnoDB hat 4ROW_FORMATs
; Der Text behandelt nur 1 oder 2 von ihnen.Wenn ein SELECT eine temporäre Tabelle erstellen muss (z. B. um die Ergebnisse zu sortieren), wird entweder eine MEMORY-Tabelle oder eine MyISAM-Tabelle erstellt. MEMORY ist effizienter. Es gibt Einschränkungen für MEMORY - man darf TEXT und BLOB nicht zulassen. Daher kann ein SELECT kann langsamer ausgeführt mit TEXT als VARCHAR.
quelle