mysql - wie viele Spalten sind zu viele?

111

Ich richte eine Tabelle mit mehr als 70 Spalten ein. Ich denke jetzt darüber nach, es aufzuteilen, da einige der Daten in den Spalten nicht jedes Mal benötigt werden, wenn auf die Tabelle zugegriffen wird. Wenn ich das mache, muss ich keine Joins mehr verwenden.

Wann, wenn überhaupt, werden zu viele Spalten berücksichtigt?

Brad
quelle
6
Wir müssen SELECT * nicht immer verwenden. Wir haben immer die Möglichkeit, nur die Spalten auszuwählen, die wir für eine bestimmte Situation benötigen.
APC
3
70 Spalten?! Wie viele davon können nicht null sein?
OMG Ponys
1
Die große Frage ist ... normalisieren Sie Ihre Tische? 70 ist eine ungewöhnliche Menge, es sei denn, Sie denormalisieren absichtlich die Leistung (nur sehr wenige Dinge haben 70 eindeutige Attribute). Wenn Sie aus Gründen der Leistung denormalisieren, stimme ich ChssPly76 zu, dass Sie alles verwenden können, was die Datenbank Ihnen ermöglicht.
Godeke
2
@KM. soll das ein witz sein? Ich bin neu in MySQL und kann es nicht bekommen. Meinten Sie, JOIN ist eine gute Sache oder etwas, das Sie vermeiden sollten?
Elia Iliashenko
2
So sehr Joins ein zentraler Bestandteil von SQL sind, wird das Joining zum Zwecke des Joins wahrscheinlich die Leistung und Wartbarkeit für jede Anwendung beeinträchtigen, die Sie haben.
Jeteon

Antworten:

142

Es wird als zu viele angesehen, sobald es über der von der Datenbank unterstützten Höchstgrenze liegt .

Die Tatsache, dass nicht jede Spalte von jeder Abfrage zurückgegeben werden muss, ist völlig normal. Aus diesem Grund können Sie mit der SELECT-Anweisung die benötigten Spalten explizit benennen.

In der Regel sollte Ihre Tabellenstruktur Ihr Domänenmodell widerspiegeln. Wenn Sie wirklich 70 (100, was haben Sie) Attribute haben, die zu derselben Entität gehören, gibt es keinen Grund, sie in mehrere Tabellen aufzuteilen.

ChssPly76
quelle
29
@KM - deshalb habe ich "Attribute, die zu derselben Entität im Domänenmodell gehören" gesagt. Eine hohe Anzahl von Spalten in der Tabelle führt NICHT zu einer Denormalisierung. Auf die genannten Spalten kommt es an. Außerdem ist Normalisierung definitiv eine gute Sache, aber KEINE Lösung für alle Probleme des Lebens. Trickfrage - Glaubst du, dass die Anzahl der Stimmen neben SO Frage / Antwort select count(*) from votesjedes Mal berechnet wird, oder denkst du, dass sie vielleicht denormalisiert ist? Macht das die SO-Datenbank schlecht und Jeff Atwood verrückt?
ChssPly76
@ ChssPly76, es ist eine relationale Datenbank, kein Objektmodell. Es gibt Tabellen, Zeilen und Spalten. Arbeiten Sie innerhalb dieser Einschränkung, wenn Sie maximale Leistung erzielen möchten. Imitieren Sie Ihre Objekte, um die Leistung zu verbessern. Sollte also jede Information über eine Person in derselben Zeile gespeichert werden? Nein, brechen Sie sie auf und gruppieren Sie sie in verschiedene Tabellen (anhand meines Beispiels aus meinem vorherigen Kommentar): "Person", "Aktivitäten", "HealthRecords". Das Speichern einer SUMME aus Leistungsgründen ist ein völlig anderes Problem als das Speichern aller Daten in 70 Spalten, um Verknüpfungen zu vermeiden.
KM.
20
Sollte "numberOfTeethPulled" Teil des Personendatensatzes sein? Nein, es sollte wahrscheinlich überhaupt nicht gespeichert werden - Sie erhalten diese Informationen von "ToothExtractionRecord", wenn Ihr Domain-Modell einen solchen Detaillierungsgrad erfordert. Aber das ist IHR (und ich wage es zu sagen, eher erfundenes) Beispiel - es hat nichts mit meinem Punkt zu tun: Eine große Anzahl von Spalten in einer Tabelle bedeutet NICHT, dass die Tabelle denormalisiert ist. Denken Sie an Immobilienverträge / Bestellungen / andere Finanzdokumente, um nur einige Beispiele zu nennen. Können sie weiter in mehrere Tabellen aufgeteilt werden? Ja. Gibt es einen Grund dafür? Nicht wirklich.
ChssPly76
1
+1, das war komisch. Wenn Sie eine andere Tabelle erstellen und es sich nur um eine 1: 1-Beziehung handelt, sollten Sie sie wahrscheinlich einfach in die Haupttabelle aufnehmen. Es wird keinen Platz sparen. Es wird nicht viel besser funktionieren, wenn Sie die Daten nicht anfordern, anstatt dass sie überhaupt nicht in der Tabelle enthalten sind. Der einzige legitime Grund, der mir
momentan
1
Wenn ich eine Tabelle mit 15 Spalten und eine andere mit 300 Spalten habe, ist der Primärschlüssel der beiden Tabellen identisch. Wählen Sie eine Spalte in den beiden Tabellen aus. Unterscheidet sich die Leistung erheblich?
Ein Angebot kann den
28

Es gibt einige Vorteile, die Tabelle in mehrere mit weniger Spalten aufzuteilen, was auch als vertikale Partitionierung bezeichnet wird . Hier sind ein paar:

  1. Wenn Sie Tabellen mit vielen Zeilen haben, kann das Ändern der Indizes sehr lange dauern, da MySQL alle Indizes in der Tabelle neu erstellen muss. Die Aufteilung der Indizes auf mehrere Tabellen könnte dies beschleunigen.

  2. Abhängig von Ihren Abfragen und Spaltentypen schreibt MySQL möglicherweise temporäre Tabellen (die in komplexeren Auswahlabfragen verwendet werden) auf die Festplatte. Dies ist schlecht, da Disk I / O ein großer Flaschenhals sein kann. Dies tritt auf, wenn die Abfrage Binärdaten (Text oder Blob) enthält.

  3. Eine breitere Tabelle kann zu einer langsameren Abfrageleistung führen.

Optimieren Sie nicht vorzeitig, aber in einigen Fällen können Sie Verbesserungen durch engere Tabellen erzielen.

Jonstjohn
quelle
5
Warum muss MySQL alle Indizes in der Tabelle neu erstellen, wenn nur ein einziger geändert wird?
Petr Peller
Ich habe mich das auch gefragt. Warum erstellt MySQL alle Indizes in der Tabelle neu? Ist die oben genannte Aussage richtig?
Maj
13

Es sind zu viele, wenn es gegen die Normalisierungsregeln verstößt. Es ist ziemlich schwierig, so viele Spalten zu erhalten, wenn Sie Ihre Datenbank normalisieren. Entwerfen Sie Ihre Datenbank so, dass das Problem modelliert wird, und nicht nach künstlichen Regeln oder Ideen zur Optimierung für eine bestimmte Datenbankplattform.

Wenden Sie die folgenden Regeln auf die breite Tabelle an, und Sie werden wahrscheinlich weit weniger Spalten in einer einzelnen Tabelle haben.

  1. Keine sich wiederholenden Elemente oder Elementgruppen
  2. Keine partiellen Abhängigkeiten von einem verketteten Schlüssel
  3. Keine Abhängigkeiten von Nicht-Schlüsselattributen

Hier ist ein Link , der Ihnen weiterhilft.

JohnFx
quelle
17
It is pretty hard to get that many columns if you are normalizing your database.Nicht so schwer wie es scheint.
Petr Peller
5
Auf jeden Fall nicht so schwer. Die Leute scheinen die normalen Formen um diese Teile herum nicht wirklich zu verstehen. Sie können 10000 Spalten haben und NOCH normalisiert werden (sogar bis zur höchsten Normalform).
Hejazzman
2
@foljs Und genau hier setzt die akzeptierte Praxis der Denormalisierung an. Wenn Sie an einer Kreuzung stehen und ein Auto in Sie hineinfährt, wäre es dumm, darauf zu warten, dass das Licht grün wird. Du musst aus dem Weg gehen. Während das Rotlicht technisch möglicherweise nicht legal ist, tun Sie das, was Sie offensichtlich tun sollten, wenn die Situation = Denormalisierung
user3308043
3
Du hast mich verloren, als du angefangen hast über Autos zu reden. Keine Ahnung, was die Relevanz ist.
JohnFx
2
Wie Sie jedoch komplexe Abfragen in diesem Szenario mit einer einzelnen Datentabelle durchführen, können Sie nicht. Sie müssen sich stark auf die Programmiersprache und eine Vielzahl anderer Dinge verlassen, damit dies funktioniert! Ich könnte also genauso gut auf eine Tabelle mit 170 Spalten zurückgreifen, da es mir als Zeitverschwendung erscheint, "JOIN" -Abfragen und eine besonders komplexe Programmierung zu haben, die erforderlich ist, damit separate Tabellen funktionieren. Ich glaube, ich bin ein großer Fan des KISS-Prinzips.
Vlad Vladimir Hercules
0

Dies ist kein Problem, es sei denn, alle Attribute gehören zur gleichen Entität und sind nicht voneinander abhängig. Um das Leben zu vereinfachen, können Sie eine Textspalte mit einem JSON-Array speichern. Wenn Sie kein Problem damit haben, jedes Mal alle Attribute abzurufen. Dies würde zwar den Zweck der Speicherung in einem RDBMS völlig zunichte machen und jede Datenbanktransaktion erheblich erschweren. Daher wird der Ansatz in der gesamten Datenbank nicht empfohlen.

Zeeshan Ch
quelle
0

Zu viele Spalten in derselben Tabelle können ebenfalls große Probleme bei der Replikation verursachen. Sie sollten wissen, dass die Änderungen, die im Master vorgenommen werden, auf den Slave repliziert werden. Wenn Sie beispielsweise ein Feld in der Tabelle aktualisieren, ist die gesamte Zeile w

Heute
quelle