Effiziente MySQL-Schema mit der Partitionierung für riesige Datensatz (7.300.000.000 Zeilen und etwa 80 GB Daten)
-
21-08-2019 - |
Andere Tipps
Wenn Sie in der Regel alle (oder die meisten), um die Daten für eine Entität abrufen Id sollten Sie erwägen, den Index nur Unternehmen id machen und nicht (ENTITY_ID, date_id.) - es sei denn, Sie die Datenbank benötigen eindeutige Kontrollen zu tun
Der Effekt ist der Index kleiner zu machen, so dass Sie mehr davon im Speicher erhalten. Ihr Ziel soll den Index sein, im Speicher zu erhalten sein. Selbst wenn Sie SELECT..ORDER NACH DATUM tun müssen, werden Sie feststellen, dass MySQL 3650 Werte in einem Bruchteil einer Sekunde im Fluge bestellen kann (ohne Index). Dieses Problem ist die Zeit, um die Zeilen von der Platte zu lesen.
Allerdings Ihr Hauptleistungsproblem ist, dass die Einfügungen in Daten, die zum einer Einheit über die Platte einen Plattenzugriff von jedem (entity, Datum) erfordern verteilt, die Abfrage läuft auf ein paar hundert Zeilen pro Sekunde machen. Ihre Partitionierung wird nicht dabei helfen becaause jede Einheit in einer einzigen Partition ist und die Zeilen über seine Festplatte verteilt. (RAID0 auf den Platten wird ein bisschen helfen).
Um ein effizientes Abrufen erhalten Sie benötigen, um die Daten für ein Unternehmen erhalten auf der Festplatte zusammenhängend zu sein, was bedeutet, dass die Daten aus dem INSERT um Nachbestellung. Sie können dies tun, mit MySQL ALTER TABLE .. ORDER BY ... aber es dauert ewig. Ich habe eine Reihe 182M Tabelle hatte dabei eine ALTER TABLE .. ORDER BY für die letzten 2 Wochen in Betrieb und es ist noch nicht beendet ist.
Deshalb hat ich einen benutzerdefinierten Speicher-Engine geschrieben!
By the way, ich bin nicht sicher, dass Sie überhaupt etwas zu durch Partitionierung gewinnen, wenn Sie mehrere Server innerhalb des Partitionierungs sind - oder zumindest mehrere Festplatten. Die harte Arbeit, die MySQL zu tun hat, wird nicht einfacher durch Partitionierung vorgenommen. Es geht nur um Plattenzugriffszeiten.
Putting jede Partition auf einer anderen Platte könnte helfen. Ich habe nicht mehr als doppelt so viele Partitionen, wie Sie physische Datenträger haben. 2 mal, anstatt 1 mal, würde einige Warteschlangen Vorteile geben, aber ich bezweifle, dass viel Wirkung haben würde. Ich bezweifle, dass Sie viel besser als eine einzelne nicht-partitionierten Tabelle RAID0 mit über so viele Platten wie möglich.
Die Leistung dieser Anwendung wird durch die Anzahl bestimmt der Platte sucht, und half damit, wenn Sie mehr sucht pro Sekunde machen kann.
Sie einige Verarbeitung Parallelität gewinnen (vorausgesetzt, Sie haben mehrere Prozessoren) mit der Partitionierung, aber Ihr System wird I / O Bindung nicht Prozessor gebunden sein. Wenn Sie Ihre Prozessor-Auslastung so hoch wie 2% erhalten Sie wahrscheinlich etwas zu tun, werden Sie nicht tun müssen (oder etwas, das nicht Ihre Anwendung ist).
Ich habe geschrieben, die Optimierung und den Betrieb dieser Art von Anwendung für den neun Jahren den Einsatz von MySQL ... und ich habe alle Narben Sie von der Erfahrung erwarten. Sobald Ihre Daten erheblich größer ist als die Größe des Speichers ist (was meine Definition von „großen“ ist), ist das gesamte Leistungsproblem Disk I / O , die von primärer die Zahl bedeutet, Platte sucht . Viel Glück !!
Sie haben angegeben, in Ihrer vorherigen Frage, die Sie alle Zeilen für eine entity_id
abruft; Wenn Sie jedoch auf die Beschaffung von Datumsbereiche auf spezifische Einheiten planen, können Sie