2013-07-03 4 views
7

Ich weiß, dass die Daten nicht inline gespeichert werden, sondern nur ein "Zeiger" ist, wenn ein Textfeld in einer MySql-Tabelle verwendet wird in der Reihe gespeichert. Ich möchte nur selten das Textfeld abrufen, also ist es besser, es in der gleichen Tabelle zu behalten, es aber aus Abfrageergebnissen wegzulassen oder es in einer separaten Tabelle zu behalten und an dieser Tabelle teilzunehmen, wenn ich es lesen möchte?Ist es performanter, Textfelder in einer MySql-Tabellenzeile oder in einer separaten Tabelle zu behalten und

Diese Tabelle könnte möglicherweise Milliarden von Zeilen haben, partitioniert sein und große (100k -> 1Mb) Textfeldwerte haben.

+0

Sie möchten sich den Textfeldern anschließen? –

+0

Nun, wenn es nur ein Zeiger ist, dann denke ich, es ist besser, in der gleichen Tabelle zu sein. Solange Sie es nicht auswählen, glaube ich nicht, dass es Ihre Abfragen beeinflussen wird. und wenn Sie trennen, ist es nur mehr "sucht" nach der db zu tun, bevor Sie das Ergebnis geben. –

+0

Keine Verbindung zu den Textfeldern, ich möchte mich einer Tabelle anschließen, die nur das Textfeld enthält. –

Antwort

0

Mein Nehmen auf mich:

normalerweise, würde ich sagen, dass es unnötig kompliziert ist eine Referenz auf einen Zeiger auf den Text zu haben, vor allem, wenn sie mit mehrere Umgang beitritt, mögliche Partitionierung usw.

auf dem Andererseits ist das ein Monster von einem Tisch. Wenn Sie jemals vergessen, das Textfeld auszuschließen oder vielleicht jemand, der nicht gut über Ihre Datenstruktur informiert ist, arbeiten an der gleichen Datenbank, die eine einfache SELECT * FROM monstertable ... gut, je nach Ihrem Server, könnte es töten/Stall für eine Weile.

Kurz gesagt: für Leistung, sollte man einzelne Tabelle etwas besser sein, für Sicherheit/Stabilität kann es sein, besser zu trennen.

ein sidenode: würde ich mich fragen, ob MySQL oder auch eine relationale Datenbank überhaupt das richtige Werkzeug für diese Aufgabe ist (und endlose Stunden damit verbringen, nach Alternativen suchen, angebrüllt bekommen und nur MySQL verwenden, da es ohnehin schon ist überall installiert und gut integriert;))

1

Eine Milliarde Zeilen mit einem Feld, das 100k ist, ist, gelinde gesagt, groß. Das kommt auf 100 Tbytes an Daten (unter Verwendung der amerikanischen Definition von "Terabyte"). Nach den documentation:

Die Speicher-Engine InnoDB hält InnoDB-Tabellen innerhalb einer Tabelle , die aus mehreren Dateien erstellt werden können. Dadurch kann eine Tabelle die maximale individuelle Dateigröße von überschreiten. Der Tablespace kann Raw Disk Partitionen enthalten, was extrem große Tabellen erlaubt. Die maximale Tablespace-Größe beträgt 64 TB.

Mit anderen Worten, Sie haben möglicherweise größere Probleme als die Leistung. Sie werden die Tabelle wahrscheinlich auf mehrere Partitionen verteilen.

Wenn Sie nur gelegentlich den Text abrufen und ihn nie für die Suche verwenden, würde ich vorschlagen, dass Sie ihn in einer separaten Tabelle speichern. Auf diese Weise können Sie diese Tabelle für den Zugriff auf diese Datensätze anpassen. Sie haben einen Primärschlüssel, der als Referenz verwendet wird, und alle Referenzen werden über diese ID geführt.

Wenn Sie den Text für Suchen verwenden, insbesondere für Suchen, die mit den "fixierten" Daten kombiniert werden, dann wäre es meine architektonische Präferenz, sie in die Basistabelle aufzunehmen, um die Suche über Felder zu erleichtern.

Aber selbst mit dieser Vorliebe ist es wahrscheinlich sicherer, sie in eine andere Tabelle zu stellen. Zum Beispiel instanziiert MySQL Unterabfragen. Es ist sehr typisch, * für eine Unterabfrage zu verwenden.Betrachten wir einen einfachen Fall: Eine Anfrage, die 1000 letzten Aufzeichnungen von Benutzer-ID bestellt zu bekommen:

select t.* 
from (select t.* 
     from t 
     order by createddate 
     limit 1000 
    ) t 
order by userid 

Die Verwendung von t.* bedeutet, dass die Textspalte ebenfalls abgerufen werden würde. Eine Abfrage, die einen Bruchteil einer Sekunde (mit einem Index) dauern könnte, müsste also mindestens 1000 * 100k = 100 Mbyte Daten lesen und schreiben. Das würde wahrscheinlich etwas länger dauern.

Zusammenfassend würde ich befürworten, die Textspalte in eine Tabelle zu stellen, wo sie oft mit anderen Spalten durchsucht wird - zum Beispiel in einer Datenbank mit Abstracts von wissenschaftlichen Arbeiten. Für wirklich große Daten würde ich es in ein separates Feld stellen, damit ich den Speicher in extremen Fällen besser verwalten kann.

Verwandte Themen