Sie müssen die Kompromisse zwischen der Verwendung von CHAR und VARCHAR erkennen
Bei CHAR-Feldern ordnen Sie genau das zu, was Sie erhalten. Beispielsweise weist CHAR (15) 15 Bytes zu und speichert diese, unabhängig davon, wie viele Zeichen Sie in das Feld eingeben. Die Manipulation von Zeichenfolgen ist einfach und unkompliziert, da die Größe des Datenfelds vollständig vorhersehbar ist.
Mit VARCHAR-Feldern erhalten Sie eine ganz andere Geschichte. Beispielsweise weist VARCHAR (15) dynamisch bis zu 16 Bytes, bis zu 15 Bytes für Daten und mindestens 1 zusätzliches Byte zum Speichern der Länge der Daten zu. Wenn Sie die Zeichenfolge 'Hallo' zum Speichern haben, die 6 Bytes und nicht 5 Bytes benötigt, muss bei der Zeichenfolgenmanipulation in jedem Fall eine Art Längenprüfung durchgeführt werden.
Der Kompromiss ist offensichtlicher, wenn Sie zwei Dinge tun:
1. Millionen oder Milliarden von Zeilen
speichern 2. Spalten indizieren, die entweder CHAR oder VARCHAR sind
Handel # 1
Offensichtlich hat VARCHAR den Vorteil, dass Daten mit variabler Länge kleinere Zeilen und damit kleinere physische Dateien erzeugen würden.
Handel # 2
Da CHAR-Felder aufgrund festgelegter Feldbreiten weniger Manipulation von Zeichenfolgen erfordern, sind Index-Lookups für CHAR-Felder im Durchschnitt 20% schneller als für VARCHAR-Felder. Dies ist keine Vermutung von meiner Seite. Das Buch MySQL Database Design and Tuning hat auf einer MyISAM-Tabelle etwas Wunderbares geleistet, um dies zu beweisen. Das Beispiel im Buch hat ungefähr Folgendes bewirkt:
ALTER TABLE tblname ROW_FORMAT=FIXED;
Diese Direktive zwingt VARCHARs, sich als CHARs zu verhalten. Ich habe dies bei meinem vorherigen Job im Jahr 2007 getan und eine Tabelle mit 300 GB erstellt und die Indexsuche um 20% beschleunigt, ohne etwas anderes zu ändern. Es funktionierte wie veröffentlicht. Es wurde jedoch ein fast doppelt so großer Tisch erstellt, aber das geht einfach auf Kompromiss Nr. 1 zurück.
Sie können die gespeicherten Daten analysieren, um festzustellen, was MySQL für die Spaltendefinition empfiehlt. Führen Sie einfach Folgendes für eine beliebige Tabelle aus:
SELECT * FROM tblname PROCEDURE ANALYSE();
Dadurch wird die gesamte Tabelle durchsucht und es werden Spaltendefinitionen für jede Spalte basierend auf den darin enthaltenen Daten, den minimalen Feldwerten, den maximalen Feldwerten usw. empfohlen. Manchmal muss man beim Planen von CHAR vs VARCHAR nur den gesunden Menschenverstand anwenden. Hier ist ein gutes Beispiel:
Wenn Sie IP-Adressen speichern, besteht die Maske für eine solche Spalte aus höchstens 15 Zeichen (xxx.xxx.xxx.xxx). Ich würde sofort zu CHAR (15) springen, da die Länge der IP-Adressen nicht allzu stark variiert und die zusätzliche Komplexität der String-Manipulation durch ein zusätzliches Byte gesteuert wird. Sie können immer noch eine PROCEDURE ANALYZE () für eine solche Spalte ausführen. Es kann sogar VARCHAR empfehlen. Mein Geld wäre in diesem Fall immer noch CHAR über VARCHAR.
CHAR vs VARCHAR-Probleme können nur durch ordnungsgemäße Planung gelöst werden. Mit großer Kraft geht große Verantwortung einher (Klischee aber wahr)