Ich las über einige Probleme mit der realen Datenbank, und in einem Projekt gab es eine Tabelle mit 100 Millionen Zeilen und 5 Spalten als primäre Tabelle. Ich denke, das ist schlecht, aber kann mir jemand genau sagen, warum?
Die Tabelle war eine Art Mikrorollup- / Aggregationstabelle, daher lauteten die 5 Spalten wie folgt (day, market_id, product_id ...). Zuerst dachte ich, dass ein 5-Spalten-Primärschlüssel nicht ideal ist, aber je mehr ich dachte, ich konnte mir keinen guten Grund einfallen lassen, warum er schlecht ist.
Dies war ein spätes Gespräch mit der Hälfte der Ingenieure des Unternehmens. Jemand hat gerade erwähnt, dass dies ein schlechtes Design ist, stimmte ein leitender Ingenieur zu, aber niemand war wirklich der Meinung, warum. Also versuche ich, die Sache selbst zu recherchieren!
quelle
Antworten:
Es gibt Leistungsprobleme bei sehr komplexen Primärschlüsseln. Und es kann sein, dass es sich nicht gegen Vervielfältigung verteidigt, sondern nur gegen einen einfacheren Primärschlüssel.
Es gibt jedoch ein Entwurfsmuster, das häufig Tabellen mit einem Primärschlüssel ergibt, der aus etwa sechs Komponenten besteht. Es sind Sternschema-Faktentabellen. Wenn die Faktentabelle eines Sternschemas sechs Dimensionen aufweist, besteht der Primärschlüssel aus sechs Komponenten. Ich habe noch nie eine Faktentabelle ohne deklarierten Primärschlüssel gesehen, und ich denke, dass sich der Aufwand lohnt, obwohl der ETL-Prozess noch recht sorgfältig geschrieben werden muss.
Einige Berichtsdatenbanken imitieren das Muster des Sternschemas, auch wenn es nicht explizit so entworfen wurde.
Über 100 Millionen Zeilen sind für eine Faktentabelle nicht allzu groß, insbesondere bei den heutigen Big Data.
quelle
Dann ist es nicht nur gut, es ist "richtig".
Und es riecht nach einer Übersichtstabelle, da es mit beginnt
day
.Haben Sie Sekundärindizes? Beachten Sie, dass bei Verwendung von InnoDB die restlichen PRIMARY KEY-Spalten am Ende des Sekundärindex angeheftet werden. Auch dies ist nicht unbedingt ein Problem.
100 Millionen Zeilen sind eine Menge für ein Rollup. Es hört sich so an, als wäre der Tisch zu feinkörnig. Das heißt, vielleicht sollten Sie stattdessen (Datum, a, b, c, d) 4 Rollups mit PKs haben, wie (Datum, a, b, c), (Datum, b, c, d), (Datum, c, d, a), (Datum, d, a, b) (oder einige geeignete Kombinationen). Dabei sind möglicherweise nur 10 Millionen Zeilen vorhanden, wodurch Berichte noch schneller erstellt werden und die Berichtsflexibilität nahezu gleich bleibt.
Oder wechseln Sie zu (Woche, a, b, c, d), was zu möglicherweise nur 14 Millionen Zeilen führt. (Wahrscheinlich mehr.)
Verwenden von PARTITION zum Erleichtern des Bereinigens --- Hochgeschwindigkeitsaufnahme --- Data Warehouse-Tipps --- Übersichtstabellen . Diese fassen viele der Techniken zusammen, die ich in verschiedenen DW-Projekten entwickelt habe. Wie Sie vielleicht schlussfolgern, ist jedes Projekt anders. Die "typische" Anzahl der Übersichtstabellen (meiner Erfahrung nach) beträgt 3-7. Das Ziel bei der Zusammenfassung sind 10 Faktenzeilen -> 1 Zusammenfassungszeile. (Das kann ein "Median" sein.) In seltenen Fällen habe ich eine Übersichtstabelle zusammengefasst. In einem anderen seltenen Fall habe ich eine Übersichtstabelle mit gutem Erfolg partitioniert. In der Regel sind Übersichtstabellen klein genug, um einen direkten Zugriff über eine Benutzeroberfläche zu ermöglichen.
quelle
Nun, eine PK mit mehr als 5 Spalten zu haben, ist an sich nicht unbedingt schlecht.
Es wird schlimm, wenn der PK auch der Clustered-Index ist, da dieser als Zeilenkennung zählt und somit zu jeder Zeile in einem NC-Index hinzugefügt wird. Dies würde den benötigten Raum drastisch vergrößern.
Es wäre auch schlecht, wenn Sie die PK tatsächlich von einem anderen FK verwenden würden, da Sie die Daten aller 5+ Spalten sowohl in der aktuellen Tabelle als auch in derjenigen haben müssten, auf die verwiesen wird. Wieder einmal wird es den Speicher um ein Vielfaches erhöhen!
In Bezug auf die Leistung ist es schlecht, wenn die PK als Index verwendet wird - sei es nur in der Tabelle oder in Verbindung mit einer FK -, da ein größerer PK-Schlüssel mit mehr als 5 Spalten mehr Platz beansprucht und somit weniger Einträge erforderlich sind passen in eine Seite und von nun an müssen mehr Seiten gelesen werden, um den Index zu analysieren.
Das heißt - es kann immer einen guten Grund geben, dies tatsächlich zu tun, wie z. B. eine Faktentabelle. Daher wäre die beste Antwort tatsächlich wie in den meisten Fällen: Es kommt darauf an!
Grüße Dennis
quelle
Seit mehr als 15 Jahren brauche ich keinen solchen Schlüssel mehr, habe ihn manchmal gesehen und nur Probleme verursacht. Viele Probleme. Der Primärschlüssel dient in erster Linie zum Speichern der Datenintegrität und sollte syntaktisch sein. Sie sollten keine Bindung zur realen Welt haben. Warum ? Sobald sich die reale Welt ändert, ist Ihr Primärschlüssel mit Sicherheit weg, und Sie müssen ihn und alle zugehörigen Informationen aktualisieren.
Stellen Sie sich vor, Sie müssen sich diesen Ker in einer anderen Tabelle / Datenbank / einem anderen Service merken, anstatt in ein Feld mehrere Felder zu kopieren, und Sie können vergessen, einige davon zu kopieren. Stattdessen ist der sysntetische Primärschlüssel nur ein Datenelement, das Sie bereitstellen müssen. Ich erwähne nicht die Eindeutigkeit des Index, der möglicherweise von einem anderen großen Thema zur Diskussion gestellt wird.
Kurze Zusammenfassung, syntetischer Primärschlüssel (automatisches Inkrementieren, Guid, ...) ist einfach zu pflegen, zu kopieren, ...
Also denke ich, syntetischer Primärschlüssel und ein weiterer Schlüssel für 5 Spalten, die Sie erwähnt haben.
Endlich, wenn die Tabelle nur aggregiert ist und nie jemand die Zeile mit Schlüsseln referenzieren muss (aber die Welt ändert sich, glauben Sie mir, zumindest für mich ändert sie sich permanent), werde ich sie wahrscheinlich so lassen, wie sie ist (primär) Schlüssel mit fünf Zeilen), aber falls wir es früher getan haben, verursacht es immer eine Menge Ärger. Also habe ich es dir gesagt.
quelle