919 Stimmen

MySQL: Großer VARCHAR vs. TEXT?

Ich habe eine Nachrichtentabelle in MySQL, die Nachrichten zwischen Benutzern aufzeichnet. Abgesehen von den typischen IDs und Nachrichtentypen (alles Integer-Typen) muss ich den eigentlichen Nachrichtentext entweder als VARCHAR oder TEXT speichern. Ich setze ein Front-End-Limit von 3000 Zeichen, was bedeutet, dass die Nachrichten nie in die Datenbank eingefügt werden, wenn sie länger sind als diese.

Gibt es einen Grund für die Verwendung von VARCHAR(3000) oder TEXT? Es gibt etwas über nur VARCHAR(3000) zu schreiben, die etwas kontra-intuitiv fühlt. Ich habe durch andere ähnliche Beiträge auf Stack Overflow gewesen, aber wäre gut, Ansichten spezifisch für diese Art von gemeinsamen Nachricht speichern zu erhalten.

36 Stimmen

Ein bisschen alt, aber ich bin hierher gekommen, weil ich auf ein Problem gestoßen bin, das mich zum Nachdenken gebracht hat. In meinem Fall war mein Front-End-Formular auf 2.000 Zeichen begrenzt, aber die in meiner Speichermethode implizierte Kodierung kodierte internationale Zeichen als Mehrfachzeichen (die anscheinend überall zwischen 3 und 12 pro Zeichen liegen können). So werden aus meinen 2.000 plötzlich bis zu 24.000. Etwas zum Nachdenken...

3 Stimmen

Ich habe festgestellt, dass Text bei vielen gleichzeitigen Einfügungen deutlich schneller ist.

1 Stimmen

@JamesS: utf8mb4... >.<

7voto

Max Punkte 313

Die vorangegangenen Antworten gehen nicht ausreichend auf das Hauptproblem ein: Selbst bei sehr einfachen Abfragen wie

(SELECT t2.* FROM t1, t2 WHERE t2.id = t1.id ORDER BY t1.id) 

kann eine temporäre Tabelle erforderlich sein, und wenn eine VARCHAR Feld beteiligt ist, wird es in ein CHAR Feld in der temporären Tabelle. Wenn Sie also in Ihrer Tabelle beispielsweise 500 000 Zeilen mit einem VARCHAR(65000) Feld, wird diese Spalte allein mit 6.5*5*10^9 Byte. Solche temporären Tabellen können nicht im Speicher verwaltet werden und werden auf die Festplatte geschrieben. Die Auswirkungen können katastrophal sein.

Quelle (mit Metriken): https://nicj.net/mysql-text-vs-varchar-performance/ (Dies bezieht sich auf die Handhabung von TEXT vs VARCHAR in der "Standard"-(?) MyISAM-Speicher-Engine. Bei anderen kann es anders sein, z. B. bei InnoDB).

4voto

Creative87 Punkte 115

Varchar ist für kleine Daten wie E-Mail-Adressen gedacht, während Text für größere Daten wie Nachrichtenartikel und Blob für binäre Daten wie Bilder geeignet ist.

Varchar ist leistungsfähiger, weil es vollständig aus dem Speicher ausgeführt wird, aber das ist nicht der Fall, wenn die Daten zu groß sind, wie varchar(4000) zum Beispiel.

Text hingegen bleibt nicht im Speicher und wird von der Festplattenleistung beeinträchtigt. Sie können dies jedoch vermeiden, indem Sie Textdaten in einer separaten Tabelle abtrennen und eine Left-Join-Abfrage zum Abrufen von Textdaten anwenden.

Blob ist viel langsamer, also verwenden Sie es nur, wenn Sie nicht viele Daten haben, wie 10000 Bilder, die 10000 Datensätze kosten.

Befolgen Sie diese Tipps für maximale Geschwindigkeit und Leistung:

  1. Verwenden Sie varchar für Namen, Titel, E-Mails

  2. Text für große Daten verwenden

  3. Getrennter Text in verschiedenen Tabellen

  4. Verwenden Sie Left Join-Abfragen für eine ID, z. B. eine Telefonnummer

  5. Wenn Sie Blob verwenden wollen, gelten die gleichen Tipps wie für Text

Dies führt dazu, dass Abfragen bei Tabellen mit Daten >10 M und einer garantierten Größe von bis zu 10 GB Millisekunden kosten.

4voto

Viktor Joras Punkte 591

Es gibt eine RIESIG Unterschied zwischen VARCHAR und TEXT. Während VARCHAR-Felder indiziert werden können, ist dies bei TEXT-Feldern nicht möglich. VARCHAR-Felder werden inline gespeichert, während TEXT-Felder offline gespeichert werden; in den Datensätzen werden nur Zeiger auf TEXT-Daten gespeichert.

Wenn Sie Ihr Feld für eine schnellere Suche, Aktualisierung oder Löschung indizieren müssen, wählen Sie VARCHAR, egal wie groß. Ein VARCHAR(10000000) wird nie dasselbe sein wie ein TEXT-Feld, da diese beiden Datentypen von Natur aus unterschiedlich sind.

  • Wenn Sie Ihr Feld nur zur Archivierung verwenden
  • Sie interessieren sich nicht für Daten Wiederherstellung der Geschwindigkeit
  • Sie legen Wert auf Geschwindigkeit, aber Sie werden den Operator verwenden '%LIKE%' in Ihrer Suchanfrage verwenden, so dass die Indizierung nicht viel helfen wird
  • Sie eine Begrenzung der Datenlänge nicht vorhersehbar ist

als sich für TEXT zu entscheiden.

1voto

Nur eine Richtigstellung zu so vielen Antworten hier, auch wenn sie etwas spät kommt.

Textfelder können von MySQL gemäß der Dokumentation vollständig indiziert werden.

Link vorhanden https://dev.mysql.com/doc/refman/5.6/en/column-indexes.html

Insgesamt sind Varchar-Felder länger zu beschreiben als Textfelder, aber das ist nur von Bedeutung, wenn Sie eine Vielzahl von Schreibanforderungen haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X