it-swarm.com.de

Bedeutung der varchar-Länge in der MySQL-Tabelle

Ich habe eine MySQL-Tabelle, in die Zeilen dynamisch eingefügt werden. Da ich mir der Länge der Saiten nicht sicher sein kann und sie nicht abschneiden möchte, mache ich sie varchar (200), was im Allgemeinen viel größer ist, als ich brauche. Gibt es einen großen Performance-Hit, wenn ein Varchar-Feld viel länger als nötig ist?

101
Brian

Nein, in dem Sinne, dass, wenn die Werte, die Sie in dieser Spalte speichern, immer weniger als 50 Zeichen sind, die Deklaration der Spalte als varchar(50) oder varchar(200) dieselbe Leistung hat.

58
Alex Martelli

Es gibt eine mögliche Auswirkung auf die Leistung: In MySQL speichern temporäre Tabellen und MEMORY-Tabellen eine VARCHAR-Spalte als Spalte mit fester Länge, die auf ihre maximale Länge aufgefüllt wird. Wenn Sie VARCHAR-Spalten entwerfen, die viel größer als die größte Größe sind, benötigen Sie mehr Speicherplatz, als Sie benötigen. Dies wirkt sich auf die Cache-Effizienz, die Sortiergeschwindigkeit usw. aus.

265
Bill Karwin

VARCHAR ist ideal für die Situation, die Sie beschreiben, da es für "variables Zeichen" steht. Der Grenzwert für Ihr Beispiel wäre 200 Zeichen. Alles andere wird akzeptiert und füllt nicht die zugewiesene Größe der Spalte . 

VARCHAR benötigt auch weniger Platz - die Werte werden als Präfix mit einer Länge von einem Byte oder zwei Byte plus Daten gespeichert. Das Längenpräfix gibt die Anzahl der Bytes im Wert an. Eine Spalte verwendet ein Längenbyte, wenn für Werte nicht mehr als 255 Byte erforderlich sind. Zwei Längenbytes, wenn für Werte mehr als 255 Byte erforderlich sind. 

Weitere Informationen zum Vergleich der MySQL CHAR-Daten mit VARCHAR-Datentypen finden Sie unter this link .

13
OMG Ponies

Größe ist Leistung! Je kleiner die Größe, desto besser. Nicht heute oder morgen, aber eines Tages werden Ihre Tische zu einer Größe herangezogen, wenn es zu ernsthaften Engpässen kommt, ganz gleich, welches Design Sie entworfen haben. Sie können jedoch einige der potenziellen Engpässe in Ihrer Entwurfsphase vorhersehen, die wahrscheinlich zuerst eintreten werden, und versuchen, die Zeit zu erhöhen, die Ihre Datenbank schnell und zufriedenstellend ausführt, bis Sie Ihr Schema überdenken oder horizontal skalieren müssen, indem Sie weitere Server hinzufügen.

In Ihrem Fall gibt es viele Leistungslücken, auf die Sie stoßen können: Große Verknüpfungen sind mit langen varchar-Spalten nahezu unmöglich. Die Indizierung dieser Spalten ist ein echter Killer. Ihre Festplatte muss die Daten speichern. Eine Speicherseite kann weniger Zeilen enthalten und Tabellenscans werden viel langsamer. Auch der Abfrage-Cache wird Ihnen hier wahrscheinlich nicht weiterhelfen.

Sie müssen sich fragen: Wie viele Einlagen pro Jahr können passieren? Was ist die durchschnittliche Länge? Benötige ich wirklich mehr als 200 Zeichen oder kann ich dies in meinem Anwendungs-Frontend feststellen, auch wenn ich die Benutzer über die maximale Länge informiert? Kann ich die Tabelle für das schnelle Indizieren und Scannen in eine schmale Tabelle unterteilen und eine weitere, um zusätzliche, weniger häufig benötigte Daten mit zunehmender Größe zu speichern? Kann ich die möglichen varchar-Daten in Kategorien eingeben und so einige der Daten in einige kleinere, möglicherweise int- oder bool-artige Spalten extrahieren und die varchar-Spalte auf diese Weise einschränken?

Sie können hier viel tun. Es kann am besten sein, mit einer ersten Annahme zu beginnen und dann Schritt für Schritt unter Verwendung realer gemessener Leistungsdaten neu zu entwerfen. Viel Glück.

13
Nudge

Performance? Festplattenspeicher? Ja, aber es ist billig und reichlich. Wenn Ihre Datenbank nicht auf Terabyte skaliert wird, sind Sie wahrscheinlich in Ordnung.

4
duffymo

Einige von Ihnen denken falsch, dass eine varchar(200) mehr Tabellengröße auf der Festplatte einnimmt als eine varchar(20). Das ist nicht der Fall. Nur wenn Sie über 255 Zeichen hinausgehen, verwendet mysql ein zusätzliches Byte, um die Länge der varchar-Felddaten zu bestimmen.

4
DCH

Es kann zu Leistungseinbußen kommen - aber normalerweise nicht auf einem Niveau, das die meisten Benutzer bemerken würden.

Wenn die Größe jedes Felds im Voraus bekannt ist, weiß MySQL genau, wie viele Bytes sich zwischen den Feldern/Zeilen befinden und kann vorwärts blättern, ohne alle Daten zu lesen. Die Verwendung variabler Zeichen verringert diese Fähigkeit zur Optimierung.

Führt varchar aufgrund von Datenfragmentierung zu Leistungseinbußen?

Noch besser, char vs varchar

Für die meisten Anwendungen sind Sie mit beiden in Ordnung - aber ist ein Unterschied, und für Datenbanken mit großem Umfang gibt es Gründe, warum Sie sich für die eine oder die andere entscheiden.

1
Rizwan Kassim

Sie sollten versuchen, eine Varchar-Spalte so anzuzeigen, wie Sie es in den meisten Szenarien tun würde, und die Länge konservativ einstellen. Sie müssen nicht immer an den Modifikator var denken, sondern eher an etwas, das sich auf Ihre Entscheidungen hinsichtlich der maximalen Länge auswirkt. Es ist wirklich als ein Leistungshinweis zu verstehen, dass die gelieferten Strings unterschiedliche Längen haben werden.

Es ist keine Direktive, der strikt von Datenbank-Internen gefolgt werden muss, sie kann vollständig ignoriert werden. Seien Sie jedoch vorsichtig, da die Implementierung manchmal ausläuft (feste Länge und Auffüllen zum Beispiel), obwohl dies in einer idealen Welt nicht der Fall sein sollte.

Wenn Sie über einen Varchar (255) verfügen, haben Sie keine Garantie, dass die Leistung in jeder Hinsicht anders ist als ein Char (255).

Es kann einfach erscheinen, es auf etwas wie 255, 65535 usw. einzustellen, das den in der Anleitung gegebenen Hinweise zu den Speicheranforderungen entspricht. Dies vermittelt den Eindruck, dass jeder Wert zwischen 0 (ja, es ist eine Sache) und 255 dieselbe Auswirkung hat. Dies kann jedoch nicht 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 die Reihenspeicherung. Es ist kein so starker Indikator für Dinge wie Indizes.

Manchmal ist es eine schwierige Frage, wie lang ein Stück Schnur sein sollte, also so hoch wie möglich, aber es hat keine Auswirkungen. Leider ist dies oft etwas, das dem Benutzer überlassen bleibt, und ist eigentlich etwas willkürlich. Sie können nicht wirklich sagen, dass Sie eine Zeichenfolge niemals übergroßen dürfen, da es Fälle gibt, in denen Sie nicht ganz sicher sind.

Sie sollten sicherstellen, dass MySQL-Abfragen einen Fehler auslösen, wenn eine Zeichenfolge zu lang ist, anstatt abgeschnitten zu werden, sodass Sie zumindest wissen, ob die Fehleremission zu kurz ist. Das Ändern der Größe von Spalten, um sie zu vergrößern oder zu verkleinern, kann eine teure DDL-Operation sein. Dies sollte beachtet werden.

Der Zeichensatz sollte auch in Betracht gezogen werden, wenn Länge und Leistung ins Spiel kommen. Die Länge bezieht sich hierauf nicht auf Bytes. Wenn Sie beispielsweise utf8 (nicht MB4) verwenden, ist varchar (255) wirklich varbinary (3 * 255). Es ist schwer zu wissen, wie sich solche Dinge wirklich entwickeln werden, ohne Tests durchzuführen und den Quellcode/die Dokumentation gründlich zu untersuchen. Aus diesem Grund besteht die Möglichkeit, dass eine überlange Länge unerwartet aufgeblasen wird. Dies gilt nicht nur für die Leistung. Wenn Sie eines Tages den Zeichensatz einer varchar-Spalte in eine größere ändern müssen, kann es sein, dass Sie ein Limit erreichen, ohne dass Sie darauf zurückgreifen, wenn Sie unnötig lange Zeichenfolgen zulassen, die vermieden werden könnten. Dies ist normalerweise ein ziemlich kleines Nischenproblem, aber es stellt sich heraus, dass es kürzlich ein erhebliches Problem mit der Einführung von utf8mb4 für MySQL und Indizes gab, die eine Beschränkung der Schlüssellänge haben.

Wenn sich herausstellt, dass MAX (LENGTH (Spalte)) immer <64 ist (z. B. wenn entschieden wurde, dass die Eingabe einen Grenzwert haben würde, der nicht mit der Spaltendefinition übereinstimmt) gute Chance, dass Sie viermal mehr Speicherplatz benötigen als in einigen Szenarien.

Dies kann Folgendes umfassen:

  • Verschiedene Motoren können einige völlig ignorieren.
  • Puffergrößen, z. B. Update oder Insert, müssen möglicherweise die vollen 255 zuweisen (obwohl ich den Quellcode nicht geprüft habe, um dies zu beweisen, ist dies nur eine Hypothese).
  • Indizes: Dies ist sofort offensichtlich, wenn Sie versuchen, einen zusammengesetzten Schlüssel aus vielen varchar (255) -Spalten zu erstellen.
  • Zwischentabellen und möglicherweise Ergebnissätze. Aufgrund der Funktionsweise von Transaktionen kann es nicht immer möglich sein, dass die tatsächliche maximale Länge von Zeichenfolgen in einer Spalte im Gegensatz zum definierten Grenzwert verwendet wird.
  • Interne vorhersagende Optimierungen können die maximale Länge als Eingabe annehmen.
  • Änderungen in Datenbank-Implementierungsversionen.

Als Faustregel gilt, dass ein Varchar wirklich nicht länger als nötig sein muss, ob es Performance-Probleme gibt oder nicht. Ich empfehle Ihnen, sich daran zu halten, wenn Sie können. Wenn Sie sich mehr Mühe geben, um die Größe Ihrer Daten zu ermitteln, einen wahren Grenzwert durchzusetzen oder den tatsächlichen Grenzwert durch Nachfragen/Nachforschungen herauszufinden, ist dies der ideale Ansatz.Wenn Sie dies nicht können, wenn Sie im Zweifelsfall etwas wie varchar (255) tun möchten, empfehle ich die Wissenschaft. Dies könnte darin bestehen, die Tabelle zu duplizieren, die Größe der Spalte var char zu verkleinern, dann die Daten aus dem Original zu kopieren und die Größe der Index-/Zeilendaten zu betrachten (auch die Spalte indizieren, versuchen Sie es auch als Primärschlüssel kann sich in InnoDB anders verhalten, da Zeilen nach Primärschlüssel geordnet sind). Zumindest wissen Sie auf diese Weise, ob Sie Auswirkungen auf IO haben, was zu einem der heikelsten Engpässe wird. Das Testen des Speicherverbrauchs ist schwieriger, das ist schwer zu testen. Ich würde empfehlen, potenzielle Worst-Cases zu testen (Abfragen mit vielen Zwischenergebnissen im Arbeitsspeicher, Überprüfung mit großen Temp-Tabellen usw.).

Wenn Sie wissen, dass es nicht viele Zeilen in der Tabelle gibt, werden Sie die Spalte nicht für Joins, Indizes (insbesondere zusammengesetzte, eindeutige) usw. verwenden. Dann werden Sie höchstwahrscheinlich keine Probleme haben.

If you know there's not going to be many rows in the table, you aren't going to use the column for joins, indexes (especially composite, unique), etc then you most likely wont have many problems.

0
jgmjgm

Da varchar nicht nur char ist, basiert die Größe auf einem internen Feld, um seine tatsächliche Länge und die Zeichenfolge selbst anzugeben. Die Verwendung von varchar (200) unterscheidet sich daher nicht wesentlich von der Verwendung von varchar (150), außer dass Sie das Potenzial haben, Mehr zu speichern. 

Und Sie sollten überlegen, was bei einem Update passiert, wenn eine Reihe wächst. Aber wenn dies selten ist, dann sollte es Ihnen gut gehen. 

0
Rob Farley

Ein weiterer Punkt, der erwähnt werden kann, ist, dass es besser ist, Zeilen mit fester Länge zu verwenden, als zu variieren. Zum Beispiel ist es besser, Spalten wie char(n), bigint, date und so weiter zu haben als varchar. Die beste Leistung der MySAM-Speicher-Engine von MySQL wird erreicht, wenn die Zeilengröße festgelegt ist.

0
Andronicus

wie der Name des Datentyps besagt, dass dies VARCHAR ist, d. h. der Datenspeicher für variable Zeichen, ordnet die mysql-Engine selbst den verwendeten Speicher den gespeicherten Daten zu.

0
user2903114