Effiziente MySQL-Schema mit der Partitionierung für riesige Datensatz (7.300.000.000 Zeilen und etwa 80 GB Daten)

StackOverflow https://stackoverflow.com/questions/666374

Frage

Dies ist eine meiner Frage nachgehen "Effizientes Speichern von 7.300.000.000 Reihen" (

War es hilfreich?

Lösung

Eine Sache, die ich nicht ganz verstehe, ist, wie Sie planen, Ihre Daten zu beschneiden. Sie haben 2M Zeilen pro Tag, aber Sie haben nicht angegeben, wie viele Daten Sie behalten möchten. Irgendwann werden Sie Daten nach Alter abzulaufen (aller Wahrscheinlichkeit nach).

An diesem Punkt wollen Sie es tun, indem Partitionen fallen, nicht durch einen Lösch ausführt, die jede einzelne Partition für eine unglaublich lange Zeit bis verriegelt (wie es verfügt über eine vollständige Tabellen-Scan zu tun, um die Zeilen zu finden löschen ), dann läßt Ihre Tabelle nicht kleiner als die Trennwände löchrig sind.

Partitionierung durch Hash ENTITY_ID könnte für die Suche sinnvoll erscheinen, aber Partitionierung von Zeit könnte Anstoßes erleichtern, wenn Sie alte Daten zu beschneiden kommen, und wird auf jeden Fall eine gute Sache sein.

MyISAM verfügt über eine Funktion „gleichzeitiger Einsatz“, die man fast auf jeden Fall muß die ganze Zeit nutzen, um die Parallelität und Leistung zu erreichen; diese beauftragt eine „keine Löschungen“ Regel, was bedeutet, dass Sie nur Löschungen tun können Partitionen durch Fallenlassen.

Aber Partitionen fallen, ist auch gut, weil Sie den Bandscheibenraum zurück bekommen kann.

all dies gesagt ist, 80G ist nicht so groß, und ich könnte versucht haben sie alle in einer einzigen Tabelle zu speichern und verwenden InnoDB den gleichzeitigen Zugriff zu ermöglichen.

Ach ja, und wenn Sie InnoDB verwendet haben, könnten Sie einen Primärschlüssel ENTITY_ID, date_id haben, was bedeutet, es Zeilen mit demselben ENTITY_ID Cluster würde. Sie würden vermutlich einen Sekundärindex auf date_id wollen effiziente Beschneidung zu ermöglichen.

Bitte testen Sie diese mit Ihren Produktionsdatengrößen und lassen Sie uns wissen, was Sie sehen!

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 !!

scroll top