MySQL5: VARCHAR vs. TEXT
globe
- datenbank
1 dedlfix
n'abend,
ich bin kürzlich darauf aufmerksam gemacht worden, dass MySQL5 VARCHARs mit "bis zu 65,535 Zeichen" behandeln kann. Für "größere" Texte nutze ich bislang TEXT als Format der Wahl (so ein MySQL4.0 Relikt, dass noch durch die Venen schwimmt).
Wenn ich mich recht erinnere, werden TEXT (LOBs) außerhalb der Record-Pages der Tabelle gespeichert. Die Record-Page enthält lediglich eine Referenz auf die Data-Page(s) des LOB. VARCHAR wird hingegen in den Record-Pages direkt gespeichert.
In der Regel hantiere ich mit Strings kürzer als 10'000 Zeichen Länge (jedoch immer UTF-8). Bei großzügigen 2byte pro Zeichen und 10k Zeichen sind wir bei ~20Kb, was deutlich unter der Max-Record-Length von 64Kb liegt und somit genügend Platz für andere Elemente des Datensatzes lässt.
Die Frage ist nun, ob is nicht mehr Sinn macht auf VARCHAR umzusteigen. Von einem Umstieg würde ich mir nicht extrem viel versprechen. Aber der Gedanke, dass die eigentlichen Daten beim ersten Record-Page-read gleich mitgeliefert werden, statt erst in einem weiteren Data-Page-read "nachgeladen" werden zu müssen, gefällt mir irgendwie...
Kann und will da jemand Stellung zu beziehen? ;)
weiterhin schönen abend...
echo $begrüßung;
Die Frage nach der Speicherung der Daten lässt sich ohne die konkrete Angabe der Storage-Engine nicht genau beantworten. Womit wir aber schon das erste Stichwort haben: Storage Engines.
Die wohl hauptsächlich verwendete Storage-Engine ist die MyISAM. Zu den dort vorhandenen Row-Formaten erzählt das Handbuch etwas in MyISAM Table Storage Formats. Demnach ist es beim ROW_FORMAT=DYNAMIC wohl so, dass Datensätze fragmentiert gespeichert werden, wenn sie durch ein Update nicht mehr an den alten Platz passen. Außerdem wird nur so viel Platz wie nötig verwendet. Bei FIXED wird generell eine feste Länge verwendet, was mit erhöhtem Speicherplatzbedarf, aber auch mit erhöhter Wiederherstellbarkeit bei Crashes einhergeht.
Doch du verwendest ja kein MyISAM sondern InnoDB. Und dafür fand ich die Antwort auf deine Frage eher beiläufig im Kapitel Restrictions on InnoDB Tables erwähnt: »InnoDB stores the first 768 bytes of a VARBINARY, VARCHAR, BLOB, or TEXT column in the row, and the rest into separate pages.« Drumrum stehen noch weitere Aussagen zu den maximalen Größen von Zeilen, die ich hier aber nicht alle zitieren möchte.
Ob es beim Lesen der verteilten Daten signifikante Unterschiede gibt? Das wird man wohl so nicht direkt beantworten und messen können. Es gibt ja auch noch diverse Caches, die da mitspielen.
echo "$verabschiedung $name";