2017-05-16 1 views
0

Wir haben eine MySQL-Datenbanktabelle mit Hunderten von Millionen von Zeilen. Wir stoßen auf Probleme bei der Durchführung von Operationen. Zum Beispiel wird das Hinzufügen von Spalten mit irgendeinem vorhersagbaren Zeitrahmen unmöglich. Wenn wir eine neue Spalte ausrollen wollen, dauert der "ALTER TABLE" -Befehl für immer, also haben wir keine gute Idee, was das Wartungsfenster ist.Strategien für große Datenbanken mit wechselnden Schemas

Wir sind nicht daran gebunden, diese Daten in mysql zu behalten, aber ich habe mich gefragt, ob es Strategien für mysql oder Datenbanken im Allgemeinen gibt, um Schemas für große Tabellen zu aktualisieren.

Eine Idee, die ich nicht besonders mag, wäre, eine neue Tabelle mit dem alten Schema plus zusätzliche Spalte zu erstellen und Abfragen für eine Ansicht auszuführen, die die Ergebnisse unionisiert, bis alle Daten in das neue Tabellenschema verschoben werden konnten.

Gerade jetzt stoßen wir auf Probleme, bei denen eine große Anzahl von Datensätzen aufgrund einer where-Klausel fehlerhaft beendet wurde.

Ideen?

+0

Könnte eine bessere Frage für den DBA Stack Exchange sein. –

Antwort

0

In MySQL können Sie eine neue Tabelle mit einem Entity-Attribut-Wert-Modell erstellen. Dies würde eine Zeile pro Entität und Attribut enthalten, anstatt das Attribut in eine neue Spalte zu schreiben.

Dies ist besonders nützlich für spärliche Daten. Vorsicht: Typen sind problematisch (alles wird zu Strings) und Sie können keine Fremdschlüsselbeziehungen definieren.

EAV-Modelle sind besonders nützlich für spärliche Werte - wenn Sie Attribute haben, die nur für eine minimale Anzahl von Rollen gelten. Sie können sich in Ihrem Fall als nützlich erweisen.

In NOSQL-Datenmodellen ist das Hinzufügen neuer Attribute oder Listen von Attributen einfacher. Es besteht jedoch keine Beziehung zu den Attributen in anderen Zeilen.

+0

Das Entity-Attribut-Wert-Modell würde die Suche viel zu langsam machen. Alles wäre eine große Verbindung. Wir haben gemeinsame Felder in regulären Spalten und ein JSON-Blob für beliebige Attribute berücksichtigt, aber JSON ist nicht sehr platzsparend. Eine andere mögliche Option wäre, zu einer spaltenartigen Datenbank zu wechseln, aber ich bin nicht sicher, wie dies die Leistung beeinflussen würde. Es ist schwierig, einen Vergleich zwischen Äpfeln und Äpfeln zu machen. – bpeikes

0

Kolumnare Datenbanken (zumindest die in MariaDB) sind sehr sparsam im Speicher - manche sagen 10x kleiner als InnoDB. Die Schrumpfung allein kann sich für 100M Reihen durchaus lohnen.

Sie haben nicht erklärt, ob Ihre Daten spärlich sind. Wenn dies der Fall ist, ist der JSON nicht so teuer für den Weltraum - lasst alle "Felder" aus, die fehlen. null Platz. Bei fast jedem anderen Ansatz gibt es zumindest einen Overhead für fehlende Zellen.

Wie Sie vorschlagen, verwenden Sie normale Spalten für allgemeine Felder. Aber auch für die Haupt Felder, die Sie sind wahrscheinlich zu suchen. Dann wirf den Rest in JSON.

Ich möchte (in dem Client) die JSON-Zeichenfolge komprimieren und eine BLOB verwenden. Dies ergibt eine 3fache Schrumpfung gegenüber unkomprimiertem TEXT.

Ich mag die Ein-Zeile pro Attribut EAV Ansatz; es ist sehr teuer im Raum, JOINs, usw., etc.

[Weitere Gedanken] auf EAV.

Vermeiden Sie, wenn möglich, ALTER.

Verwandte Themen