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:
- feste Länge
- Zeichenfolgen im C-Stil (am Ende der Zeichenfolge mit NULL oder einem ähnlichen Zeichen gekennzeichnet)
- Pascal-Zeichenfolgen (ein paar Bytes zur Angabe der Länge, dann die Zeichenfolge)
- Zeiger (speichern Sie den String an einer anderen Stelle)
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 :
- Unterstützung für einen echten VARCHAR-Typ; Eine VARCHAR-Spalte beginnt mit einer Länge, die in ein oder zwei Bytes gespeichert ist.
- Tabellen mit VARCHAR-Spalten können eine feste oder dynamische Zeilenlänge haben.
- Die Summe der Längen der VARCHAR- und CHAR-Spalten in einer Tabelle kann bis zu 64 KB betragen.
Während für InnoDB :
- Der Teil mit variabler Länge des Datensatzkopfs enthält einen Bitvektor zum Anzeigen von NULL-Spalten. Wenn die Anzahl der Spalten im Index NULL sein kann, 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 Platz als das Bit in diesem Vektor. Der Teil der Kopfzeile mit variabler Länge enthält auch die Längen der Spalten mit variabler Länge. Jede Länge nimmt ein oder zwei Bytes in Anspruch, 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 Datensatzkopf keinen Teil mit variabler Länge.
- Für jedes Feld mit variabler Länge, das nicht NULL ist, enthält der Datensatzkopf die Länge der Spalte in ein oder zwei Bytes. Zwei Bytes werden nur benötigt, wenn ein Teil der Spalte extern in Überlaufseiten gespeichert ist oder die maximale Länge 255 Bytes und die tatsächliche Länge 127 Bytes überschreitet. Für eine extern gespeicherte 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, 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.