Ich habe eine Nachrichtentabelle in MySQL, die Nachrichten zwischen Benutzern aufzeichnet. Abgesehen von den typischen IDs und Nachrichtentypen (alle Ganzzahltypen) muss ich den eigentlichen Nachrichtentext entweder als VARCHAR oder als TEXT speichern. Ich setze ein Front-End-Limit von 3000 Zeichen, was bedeutet, dass die Nachrichten niemals so lange in die Datenbank eingefügt werden.
Gibt es eine Begründung für VARCHAR (3000) oder TEXT? Es ist etwas, nur VARCHAR (3000) zu schreiben, das sich etwas kontraintuitiv anfühlt. Ich habe andere ähnliche Beiträge zu Stack Overflow gelesen, wäre aber gut, um Ansichten zu erhalten, die für diese Art der allgemeinen Nachrichtenspeicherung spezifisch sind.
Antworten:
TEXT
undBLOB
kann durch Speichern außerhalb der Tabelle, wobei die Tabelle nur einen Zeiger auf den Ort des tatsächlichen Speichers aufweist. Wo es gespeichert wird, hängt von vielen Faktoren wie Datengröße, Spaltengröße, Zeilenformat und MySQL-Version ab.VARCHAR
wird inline mit der Tabelle gespeichert.VARCHAR
ist schneller, wenn die Größe angemessen ist, deren Kompromiss schneller von Ihren Daten und Ihrer Hardware abhängt. Sie möchten ein reales Szenario mit Ihren Daten vergleichen.quelle
varchar
undblob
/text
in InnoDB für kleine Textelemente geben? So wäre es dann sinnvoll sein , nur jeder machtvarchar
einetext
Art und lassen Sie die DB den Inline vs. Überlauf zu verwalten?Können Sie vorhersagen, wie lange die Benutzereingabe dauern würde?
quelle
Nur um die Best Practice zu klären:
Textformatnachrichten sollten fast immer als TEXT gespeichert werden (sie sind beliebig lang).
Zeichenfolgenattribute sollten als VARCHAR gespeichert werden (der Zielbenutzername, der Betreff usw.).
Ich verstehe, dass Sie ein Front-End-Limit haben, das großartig ist, bis es nicht mehr ist. * grins * Der Trick besteht darin, sich die Datenbank als getrennt von den Anwendungen vorzustellen, die eine Verbindung zu ihr herstellen. Nur weil eine Anwendung die Daten begrenzt, bedeutet dies nicht, dass die Daten an sich begrenzt sind.
Was ist mit den Nachrichten selbst, das sie zwingt, niemals mehr als 3000 Zeichen zu sein? Wenn es sich nur um eine beliebige Anwendungsbeschränkung handelt (z. B. für ein Textfeld oder etwas anderes), verwenden Sie ein
TEXT
Feld auf der Datenebene.quelle
Haftungsausschluss: Ich bin kein MySQL-Experte ... aber dies ist mein Verständnis der Probleme.
Ich denke, TEXT wird außerhalb der MySQL-Zeile gespeichert, während ich denke, dass VARCHAR als Teil der Zeile gespeichert ist. Es gibt eine maximale Zeilenlänge für MySQL-Zeilen. Sie können also mithilfe von VARCHAR begrenzen, wie viele andere Daten Sie in einer Zeile speichern können.
Da VARCHAR Teil der Zeile ist, vermute ich, dass Abfragen, die dieses Feld betrachten, etwas schneller sind als Abfragen, die einen TEXT-Block verwenden.
quelle
varchar
Spalte mit 3000 Zeichen bis zu 9000 Byte aufnehmen kann.TEXT
Inline in der Tabelle speichert .Kurze Antwort: Kein praktischer, Leistungs- oder Speicherunterschied.
Lange Antwort:
Es gibt im Wesentlichen keinen Unterschied (in MySQL) zwischen
VARCHAR(3000)
(oder einem anderen großen Limit) undTEXT
. Ersteres wird bei 3000 Zeichen abgeschnitten ; Letzteres wird bei 65535 Bytes abgeschnitten . (Ich unterscheide zwischen Bytes und Zeichen, da ein Zeichen mehrere Bytes aufnehmen kann.)Für kleinere Grenzwerte
VARCHAR
gibt es einige Vorteile gegenüberTEXT
.CHARACTER SET
.INDEXes
sind darauf beschränkt, wie groß eine Spalte indiziert werden kann. (767 oder 3072 Bytes ; dies ist abhängig von der Version und den Einstellungen)SELECTs
werden auf zwei verschiedene Arten behandelt: MEMORY (schneller) oder MyISAM (langsamer). Wenn es sich um 'große' Spalten handelt, wird die langsamere Technik automatisch ausgewählt. (Wesentliche Änderungen in Version 8.0; Änderungen an diesem Aufzählungszeichen vorbehalten.)TEXT
Datentypen (im Gegensatz zuVARCHAR
) direkt zu MyISAM. Das heißt,TINYTEXT
ist für generierte temporäre Tabellen automatisch schlechter als das ÄquivalentVARCHAR
. (Aber das führt die Diskussion in eine dritte Richtung!)VARBINARY
ist wieVARCHAR
;BLOB
ist wieTEXT
.Gegenargument zu anderen Antworten
Bei der ursprünglichen Frage wurde eine Frage gestellt (welcher Datentyp verwendet werden soll). Die akzeptierte Antwort beantwortete etwas anderes (Off-Record-Speicher). Diese Antwort ist jetzt veraltet.
Als dieser Thread gestartet und beantwortet wurde, gab es in InnoDB nur zwei "Zeilenformate". Bald darauf wurden zwei weitere Formate (
DYNAMIC
undCOMPRESSED
) eingeführt.Der Speicherort für
TEXT
undVARCHAR()
basiert auf der Größe und nicht auf dem Namen des Datentyps . Eine aktualisierte Beschreibung der On / Off-Record-Speicherung großer Text- / Blob-Spalten finden Sie hier .quelle
Die vorhergehenden Antworten bestehen nicht genug auf dem Hauptproblem: selbst bei sehr einfachen Fragen wie
Eine temporäre Tabelle kann erforderlich sein. Wenn ein
VARCHAR
Feld betroffen ist, wird es in einCHAR
Feld in der temporären Tabelle konvertiert . Wenn Sie also in Ihrer Tabelle 500 000 Zeilen mit einemVARCHAR(65000)
Feld angeben , verwendet diese Spalte allein 6,5 * 5 * 10 ^ 9 Byte. Solche temporären Tabellen können nicht im Speicher verarbeitet werden und werden auf die Festplatte geschrieben. Die Auswirkungen sind voraussichtlich katastrophal.Quelle (mit Metriken): https://nicj.net/mysql-text-vs-varchar-performance/ (Dies bezieht sich auf die Behandlung von
TEXT
vsVARCHAR
in der "Standard" (?) MyISAM-Speicher-Engine. In anderen kann es anders sein, zB InnoDB.)quelle
Es gibt einen RIESIGEN Unterschied zwischen VARCHAR und TEXT. Während VARCHAR-Felder indiziert werden können, können TEXT-Felder nicht. Felder vom Typ VARCHAR werden inline gespeichert, während TEXT offline gespeichert wird. 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ß es ist. Ein VARCHAR (10000000) ist niemals dasselbe wie ein TEXT-Feld, da diese beiden Datentypen unterschiedlicher Natur sind.
als für TEXT gehen.
quelle
Varchar ist für kleine Daten wie E-Mail-Adressen gedacht, während Text für viel größere Daten wie Nachrichtenartikel und Blob für Binärdaten wie Bilder.
Die Leistung von Varchar ist leistungsfähiger, da es vollständig aus dem Speicher ausgeführt wird. Dies ist jedoch nicht der Fall, wenn die Daten beispielsweise zu groß sind
varchar(4000)
.Text hingegen bleibt nicht im Speicher haften und wird durch die Festplattenleistung beeinträchtigt. Sie können dies jedoch vermeiden, indem Sie Textdaten in einer separaten Tabelle trennen und eine Abfrage für die linke Verknüpfung anwenden, um Textdaten abzurufen.
Blob ist viel langsamer, verwenden Sie es also nur, wenn Sie nicht viele Daten wie 10000 Bilder haben, die 10000 Datensätze kosten.
Befolgen Sie diese Tipps für maximale Geschwindigkeit und Leistung:
Verwenden Sie varchar für Namen, Titel und E-Mails
Verwenden Sie Text für große Datenmengen
Separaten Text in verschiedenen Tabellen
Verwenden Sie Linksverknüpfungsabfragen für eine ID, z. B. eine Telefonnummer
Wenn Sie Blob verwenden möchten, wenden Sie die gleichen Tipps wie im Text an
Dadurch kosten Abfragen Millisekunden für Tabellen mit Daten> 10 M und einer garantierten Größe von bis zu 10 GB.
quelle