Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gibt es Nachteile bei der Verwendung eines generischen varchar(255) für alle textbasierten Felder?

Im Speicher VARCHAR(255) ist intelligent genug, um im Gegensatz zu CHAR(255) nur die Länge zu speichern, die Sie für eine bestimmte Zeile benötigen die immer 255 Zeichen speichern würde.

Aber da Sie diese Frage mit MySQL getaggt haben, erwähne ich einen MySQL-spezifischen Tipp:Da Zeilen von der Speicher-Engine-Schicht auf die SQL-Schicht kopiert werden, VARCHAR Felder werden in CHAR umgewandelt um den Vorteil zu nutzen, mit Reihen mit fester Breite zu arbeiten. Die Strings im Speicher werden also auf die maximale Länge aufgefüllt Ihres deklarierten VARCHAR Spalte.

Wenn Ihre Abfrage implizit eine temporäre Tabelle erzeugt, zum Beispiel beim Sortieren oder GROUP BY , kann dies viel Speicher verbrauchen. Wenn Sie viel VARCHAR(255) verwenden Felder für Daten, die nicht so lang sein müssen, kann dies die temporäre Tabelle sehr groß machen.

Vielleicht möchten Sie auch wissen, dass dieses „Auffüllen“-Verhalten bedeutet, dass eine mit dem utf8-Zeichensatz deklarierte Zeichenfolge auf drei Bytes pro Zeichen aufgefüllt wird, selbst für Zeichenfolgen, die Sie mit Single-Byte-Inhalt speichern (z. B. ASCII- oder latin1-Zeichen). Und ebenso bewirkt der utf8mb4-Zeichensatz, dass die Zeichenfolge auf vier Bytes pro Zeichen im Speicher aufgefüllt wird.

Also ein VARCHAR(255) in utf8 benötigt das Speichern eines kurzen Strings wie "Keine Meinung" 11 Bytes auf der Festplatte (zehn Zeichen mit niedrigerem Zeichensatz plus ein Byte für die Länge), aber es benötigt 765 Bytes im Speicher und somit in temporären Tabellen oder sortierten Ergebnissen.

Ich habe MySQL-Benutzern geholfen, die häufig unwissentlich temporäre Tabellen mit 1,5 GB erstellt und ihren Speicherplatz aufgefüllt haben. Sie hatten viele VARCHAR(255) Spalten, die in der Praxis sehr kurze Zeichenfolgen gespeichert haben.

Am besten definieren Sie die Spalte basierend auf dem Datentyp, den Sie speichern möchten. Es hat Vorteile, anwendungsbezogene Einschränkungen durchzusetzen, wie andere Leute bereits erwähnt haben. Aber es hat die physikalischen Vorteile, die oben beschriebene Speicherverschwendung zu vermeiden.

Es ist natürlich schwer zu wissen, was die längste Postanschrift ist, weshalb viele Leute einen langen VARCHAR wählen das ist sicherlich länger als jede Adresse. Und 255 ist üblich, weil es die maximale Länge eines VARCHAR ist für die die Länge mit einem Byte kodiert werden kann. Es war auch das Maximum VARCHAR Länge in MySQL älter als 5.0.