2012-12-07 3 views
14

Während der Suche durch SO habe ich zwei widersprüchliche Antworten gefunden (und sogar einen Kommentar, der das sagte), aber keine definitive Antwort:TEXT/BLOB in derselben Tabelle speichern oder nicht?

Das Problem ist: gibt es irgendwelche Leistungsvorteile, wenn Sie ein TEXT/BLOB-Feld speichern außerhalb eines Tisches?

Wir gehen davon aus:

  • Sie richtig SELECT (nur die Auswahl des TEXT/BLOB, wenn erforderlich, keine SELECT *)
  • Tabellen korrekt indiziert, wo es Sinn macht (so ist es nicht eine Frage der ' wenn Sie es indexieren ')
  • Das Datenbankdesign ist nicht wirklich wichtig. Dies ist eine Frage, um das MySQL-Verhalten in diesem speziellen Fall zu identifizieren, nicht um bestimmte Datenbankentwurfsprobleme zu lösen. Nehmen wir an, diese Datenbank nur eine Tabelle (oder zwei, wenn die TEXT/BLOB getrennt wird)
  • verwendet Motor: innoDB (andere auch interessant wäre, wenn sie unterschiedliche Ergebnisse holen)

Diese post states, dass das TEXT/BLOB in eine separate Tabelle zu bringen, hilft nur, wenn Sie bereits falsch auswählen (immer SELECT das TEXT/BLOB, auch wenn es nicht notwendig ist) - im Grunde, dass TEXT/BLOB in der Die gleiche Tabelle ist im Grunde die bessere Lösung (weniger Komplexität, keine Leistungseinbußen usw.), da das TEXT/BLOB unabhängig voneinander gespeichert wird

Die einzige Zeit, in der das Verschieben von TEXT-Spalten in eine andere Tabelle einen Vorteil bringt, ist die Tendenz, normalerweise alle Spalten aus Tabellen auszuwählen. Dies führt lediglich zu einer zweiten schlechten Übung, um die erste zu kompensieren. Es sollte selbstverständlich sein, dass die zwei Fehler nicht gleich sind wie drei Linke.

MySQL Table with TEXT column


Dieser Beitrag jedoch heißt es:

Wenn eine Tabelle TEXT oder BLOB-Spalten hat, kann die Tabelle nicht im Speicher abgelegt werden

Bedeutet das, dass es bereits ausreicht, ein TEXT/BLOB in einer Tabelle zu haben, um eine Performance zu erzielen?

MySQL varchar(2000) vs text?


Meine Frage ist im Grunde: Was ist die richtige Antwort?

Ist es wirklich wichtig, wenn Sie TEXT/BLOB in einer separaten Tabelle speichern, wenn Sie SELECT richtig?

Oder hat sogar ein TEXT/BLOB in einer Tabelle einen potenziellen Leistungshit?

+1

Jede spezifische Speicher-Engine, die Sie verwenden? InnoDB/MyISAM/NDB, etc. – gertvdijk

+0

@gertvdijk Ich habe es hinzugefügt - ich bin besonders interessiert an einer Lösung in Bezug auf InnoDB - aber im Grunde, wenn es einen Unterschied gibt, wäre MyISAM und andere Speicher-Engines auch interessant – Katai

Antwort

12

Wenn auf Ihrer MySQL-Version, verwenden Sie das InnoDB Barracuda Dateiformat

innodb_file_format=barracuda 

in Ihrer MySQL-Konfiguration und richten Sie Ihre Tabellen mit ROW_FORMAT=Dynamic (oder Compressed) eigentlich mit, es zu benutzen.

Dies wird InnoDB dazu bringen, BLOBs, TEXTs und größere VARCHARs außerhalb der Zeilenseiten zu speichern und somit viel effizienter zu machen. Weitere Informationen finden Sie unter this MySQLperformanceblog.com blog article.

Soweit ich es verstehe, wird die Verwendung des Barracuda-Formats das Speichern von TEXT/BLOB/VARCHARs in separaten Tabellen aus Performance-Gründen nicht mehr zulassen. Ich denke jedoch, dass es immer gut ist, eine ordnungsgemäße Normalisierung der Datenbank im Auge zu behalten.

4

Ein Leistungszuwachs ist eine Tabelle mit festen Längensätzen zu haben. Dies würde bedeuten, dass keine Felder mit variabler Länge wie varchar oder text/blob verwendet werden. Bei Datensätzen fester Länge muss MySQL das Ende eines Datensatzes nicht "suchen", da es den Größenversatz kennt. Es weiß auch, wie viel Speicher benötigt wird, um X-Datensätze zu laden. Tabellen mit Datensätzen fester Länge sind weniger anfällig für Fragmentierung, da aus gelöschten Datensätzen verfügbarer Speicherplatz vollständig wiederverwendet werden kann. MyISAM-Tabellen haben tatsächlich einige andere Vorteile von Datensätzen fester Länge.

Wenn Sie innodb_file_per_table verwenden, erhöht die Beibehaltung des tex/blob in einer separaten Tabelle die Wahrscheinlichkeit, dass das Dateisystem-Caching verwendet wird, da die Tabelle kleiner wird.

Das heißt, das ist eine Mikrooptimierung. Es gibt viele andere Dinge, die Sie tun können, um viel größere Leistungssteigerungen zu erzielen. Verwenden Sie beispielsweise SSD-Laufwerke. Es wird dir nicht genug von einem Leistungsschub geben, um den Tag der Abrechnung hinauszuschieben, wenn deine Tische so groß werden, dass du Sharding implementieren musst.

Sie hören nicht mehr von Datenbanken, die das "rohe Dateisystem" verwenden, obwohl es viel schneller sein kann. "Raw" ist, wenn die Datenbank unter Umgehung eines beliebigen Dateisystems direkt auf die Festplattenhardware zugreift. Ich denke, Oracle unterstützt das immer noch. Aber es ist einfach nicht die zusätzliche Komplexität wert, und Sie müssen wirklich wissen, was Sie tun. Meiner Meinung nach ist das Speichern Ihres Textes/Blobs in einer separaten Tabelle einfach nicht die zusätzliche Komplexität für den möglichen Leistungsgewinn wert. Sie müssen wirklich wissen, was Sie tun, und Ihre Zugriffsmuster, um davon zu profitieren.

+0

Ja, aber was soll es bedeutet für eine Tabelle, die tatsächlich einen TEXT darin hat? Wenn MySQL das TEXT extern speichert, sollte es im Grunde nur ein Zeiger auf diesen externen Speicher sein, also sollte es ungefähr dasselbe sein wie das Speichern des TEXT in einer separaten Tabelle, manuell. Das ist grundsätzlich die Frage, passiert das schon automatisch? (separate Speicherung) Was ich herausfinden will, ob es Unsinn ist oder nicht, es manuell zu tun. Wie wird diese automatische 'Referenz' zum TEXT gehandhabt? – Katai

+0

Es gibt einen Unterschied zwischen MySQL, das den TEXT "external" speichert und TEXT extern in einer separaten Datei speichert. MySQL speichert es "extern" innerhalb der Datei, genauso wie Index und Daten in derselben Datei mit Innodb gespeichert werden. Wenn Sie es in einer separaten Tabelle speichern, handelt es sich um eine separate Datei. Es ist nicht Unsinn, es manuell zu tun, aber Sie erhalten nicht einmal eine 1% ige Leistungssteigerung. Es wird nicht einmal messbar sein, bis Sie viele Millionen Datensätze haben. –

Verwandte Themen