Frage

Ich bin die Optimierung einiger InnoDB-Tabellen in MySQL, so lief ich Prozedur analsye () , um zu sehen, was die Empfehlungen waren.

Die Ergebnisse empfohlen TINYTEXT statt varchar (255) für alle Felder, die zuvor als varchar eingerichtet wurden (255)

Gibt es einen Leistungsgewinn , um durch die Verwendung gehabt werden TINYTEXT ? Ich bin nur besorgt über die Geschwindigkeit hier, nicht Größe.

War es hilfreich?

Lösung

Sie nicht glauben, wenn jemand Ihnen sagt, dass TINYTEXT auf andere Weise gespeichert ist, als VARCHAR.

Die tatsächlichen Unterschiede sind:

  • TINYTEXT und andere Textfelder von Zeile im Speicher separat gespeichert sind in MySQL Heap, während VARCHAR () Felder hinzufügen bis zu 64k Grenze (so können Sie mehr als 64k in TINYTEXTs haben, während Sie werden nicht mit VARCHAR).

  • TINYTEXT und andere ‚Blob-like‘ Felder SQL Schicht zwingen werden (MySQL) temporäre Tabellen auf der Festplatte zu verwenden, wenn sie verwendet werden, während VARCHAR wird noch sortiert werden ‚im Speicher‘ (obwohl konvertiert werden werden CHAR für die volle Breite).

  • InnoDB intern nicht wirklich egal, ob es TINYTEXT oder varchar ist. Es ist sehr einfach zu überprüfen, erstellen Sie zwei Tabellen, eine mit VARCHAR (255), ein weiteres mit TINYINT, und einen Datensatz sowohl einzufügen. Beide werden einzelne 16k Seite nehmen -. Während bei Überlauf-Seiten verwendet werden, TINYTEXT Tabelle mindestens 32k als Einnahme in 'SHOW TABLE STATUS' zeigen sollte

Ich ziehe es in der Regel VARCHAR (255) - sie für einzelne Reihe von Heapfragmentierung nicht zu viel verursachen, und kann als einzelnes 64k Objekt im Speicher innerhalb MySQL behandelt werden. Auf InnoDB sind Größenunterschiede vernachlässigbar.

Andere Tipps

würde ich erwarten, varchar als TINYTEXT schneller zu sein, und von meinem um das Googeln scheint der allgemeine Konsens zu sein. Natürlich würden Sie Ihr System zu testen, wirklich sicher zu sein.

Der Grund ist es schneller ist, weil, wenn MySQL tut bestimmte Arten von Operationen (Joins, Sortierungen etc.) wird es oft temporäre Tabellen erstellen. Wenn Sie einen BLOB-Typ (wie TINYTEXT) in einer temporären Tabelle haben die Tabelle eher Platten basieren als Speicher basiert, was natürlich Auswirkungen auf die Leistung haben würde.

CHAR / VARCHAR schneller sein wird, da diese Spalten in der gleichen Seite wie die Hauptzeilendaten * gespeichert werden, während TEXT-Typen ab Seite gespeichert sind, (ich bin falsch, siehe Kommentar von Harrison ).

Die Menschen früher viel verwenden TINYTEXT weil varchar (annoyingly) getrimmt nachfolgende Leerzeichen. Dieses Verhalten wurde in MySQL entfernt 5.0.

(* Zumindest für das erste 768 Bytes, und mit einem in den InnoDB, nicht die neue InnoDB Plugin).

Sie können auch bei Verwendung von char(255) aussehen - während es mehr Platz nicht verwendet, es war wesentlich schneller (in meiner Erfahrung), ein Feld zu verwenden, die eine konstante Größe ist, wenn späteren Vergleiche zu tun. Der zusätzliche Platz kann mit Polsterung gefüllt werden, wenn Sie für nur Geschwindigkeit suchen, dann später die Leerzeichen ignorieren.

Beachten Sie jedoch, MySQL nicht varchar und char Typen existieren in der gleichen Tabelle ermöglichen. Auch nicht [in der Regel] erlauben Vergleiche zwischen varchar und char. Ich fand das letzte Jahr, wenn Sie einen Tisch Implementierung für ein Hobby zu tun Projekt .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top