Sie sollten versuchen, eine Varchar-Spalte genauso anzuzeigen wie eine Char-Spalte in den meisten Szenarien, und die Länge konservativ festlegen. Sie müssen nicht immer an den Var-Modifikator denken, sondern an etwas, das Ihre Entscheidung über die maximale Länge beeinflusst. Es sollte wirklich als Leistungshinweis gesehen werden, dass die mitgelieferten Saiten unterschiedlich lang sind.
Es ist keine Anweisung, die von Datenbank-Interna strikt befolgt werden muss, sie kann vollständig ignoriert werden. Seien Sie jedoch vorsichtig, da die Implementierung manchmal auslaufen kann (z. B. feste Länge und Polsterung), obwohl dies in einer idealen Welt nicht der Fall sein sollte.
Wenn Sie einen Varchar (255) haben, können Sie nicht garantieren, dass sich die Leistung unter allen Umständen immer anders verhält als ein Char (255).
Es kann einfach erscheinen, es auf etwas wie 255, 65535 usw. einzustellen, entsprechend den Hinweisen im Handbuch zu den Speicheranforderungen. Dies erweckt den Eindruck, dass jeder Wert zwischen 0 (ja, es ist eine Sache) und 255 die gleiche Auswirkung hat. Dies kann jedoch nicht vollständig garantiert werden.
Die Speicheranforderungen sind in der Regel wahr oder ein guter Indikator für anständige und ausgereifte persistente Speicher-Engines in Bezug auf den Zeilenspeicher. Es ist kein so starker Indikator für Dinge wie Indizes.
Es ist manchmal eine schwierige Frage, wie lang ein Stück Schnur genau sein sollte, um es auf die höchste Grenze zu bringen, von der Sie wissen, dass es innerhalb sein sollte, aber das hat keine Auswirkungen. Leider bleibt dies oft dem Benutzer überlassen und es ist wirklich etwas willkürlich. Man kann nicht wirklich sagen, dass man eine Zeichenfolge niemals überdimensioniert, weil es Fälle gibt, in denen man sich nicht ganz sicher ist.
Sie sollten sicherstellen, dass MySQL-Abfragen einen Fehler auslösen, wenn eine Zeichenfolge zu lang ist, anstatt sie abzuschneiden, damit Sie zumindest wissen, ob sie aufgrund von Fehleremissionen möglicherweise zu kurz ist. Das Ändern der Größe von Spalten zum Vergrößern oder Verkleinern kann eine teure DDL-Operation sein. Dies sollte beachtet werden.
Der Zeichensatz sollte auch dort berücksichtigt werden, wo Länge und Leistung ins Spiel kommen. Die Länge bezieht sich eher auf diese als auf Bytes. Wenn Sie beispielsweise utf8 verwenden (nicht MB4), ist varchar (255) wirklich varbinary (3 * 255). Es ist schwer zu wissen, wie sich solche Dinge wirklich entwickeln werden, ohne Tests durchzuführen und sich eingehend mit Quellcode / Dokumentation zu befassen. Aus diesem Grund besteht die Möglichkeit, dass eine zu lange Länge einen unerwartet aufgeblasenen Aufprall hat. Dies gilt nicht nur für die Leistung. Wenn Sie eines Tages den Zeichensatz einer Varchar-Spalte in einen größeren ändern müssen, könnten Sie ohne Rückgriff auf ein Limit stoßen, wenn Sie zulassen, dass unentgeltlich lange Zeichenfolgen vorhanden sind, die hätten vermieden werden können. Dies ist normalerweise ein ziemlich Nischenproblem, aber es kommt auf,
Wenn sich herausstellt, dass MAX (LENGTH (Spalte)) immer <64 ist (z. B. wenn entschieden wurde, dass die Eingabe nicht mit der Spaltendefinition übereinstimmt), Sie aber varchar (255) haben, gibt es eine Gute Chance, dass Sie in einigen Szenarien viermal mehr Speicherplatz benötigen als benötigt.
Dies kann Folgendes umfassen:
- Verschiedene Motoren, einige können es völlig ignorieren.
- Puffergrößen, zum Beispiel Aktualisieren oder Einfügen, müssen möglicherweise die vollen 255 zuweisen (obwohl ich den Quellcode nicht überprüft habe, um dies zu beweisen, ist dies nur eine Hypothese).
- Indizes, dies wird sofort offensichtlich, wenn Sie versuchen, einen zusammengesetzten Schlüssel aus vielen varchar (255) -Spalten zu erstellen.
- Zwischentabellen und möglicherweise Ergebnismengen. Angesichts der Funktionsweise von Transaktionen ist es möglicherweise nicht immer möglich, dass etwas die tatsächliche maximale Länge von Zeichenfolgen in einer Spalte im Gegensatz zum definierten Grenzwert verwendet.
- Interne prädiktive Optimierungen können die maximale Länge als Eingabe verwenden.
- Änderungen in den Datenbankimplementierungsversionen.
Als Faustregel gilt, dass ein Varchar nicht länger sein muss, als es ohnehin sein muss, Leistungsprobleme oder nicht. Ich empfehle daher, sich daran zu halten, wenn Sie können. Der ideale Ansatz besteht darin, sich mehr Mühe zu geben, um die Größe Ihrer Daten zu ermitteln, ein echtes Limit durchzusetzen oder das wahre Limit durch Fragen / Nachforschungen herauszufinden.
Wenn Sie nicht können, wenn Sie in Zweifelsfällen etwas wie varchar (255) tun möchten, empfehle ich, die Wissenschaft zu betreiben. Dies kann darin bestehen, die Tabelle zu duplizieren, die Größe der var char-Spalte zu verringern, dann die Daten aus dem Original in die Spalte zu kopieren und die Größe der Index- / Zeilendaten zu überprüfen (indizieren Sie auch die Spalte, versuchen Sie es auch als Primärschlüssel, der kann sich in InnoDB anders verhalten, da die Zeilen nach Primärschlüssel sortiert sind). Zumindest auf diese Weise wissen Sie, ob Sie einen Einfluss auf die E / A haben, der zu den empfindlichsten Engpässen zählt. Das Testen der Speichernutzung ist schwieriger, es ist schwierig, dies ausführlich zu testen. Ich würde empfehlen, potenzielle Worst-Cases zu testen (Abfragen mit vielen Zwischenergebnissen im Speicher, überprüfen Sie mit EXPLAIN auf große temporäre Tabellen usw.).
Wenn Sie wissen, dass die Tabelle nicht viele Zeilen enthält, Sie die Spalte nicht für Verknüpfungen, Indizes (insbesondere zusammengesetzte, eindeutige) usw. verwenden, werden Sie höchstwahrscheinlich nicht viele Probleme haben.
VARCHAR(255) utf8mb4
Spalte mit ~ 150.000 Zeilen hatte eine Größe von 11,5 MB. Eine Tabelle mit einerVARCHAR(48) utf8mb4
indizierten Spalte mit denselben Daten (maximale Länge 46 Zeichen) verwendete 4,5 MB. Es ist kein großer Unterschied bei Abfragen, es ist indiziert. Aber es summiert sich mit Abfrage-E / A und Dingen wie Datenbanksicherungen.