MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

Datenbankdesign 101:Partitionen in MySQL

In diesem Blogeintrag werden wir eines der am häufigsten verwendeten Features von MySQL diskutieren - Partitionen.

Was ist Partitionieren?

In MySQL ist die Partitionierung eine Datenbankentwurfstechnik, bei der eine Datenbank Daten in mehrere Tabellen aufteilt, die Daten aber dennoch von der SQL-Schicht als eine einzige Tabelle behandelt. Einfach ausgedrückt, wenn Sie eine Tabelle partitionieren, teilen Sie sie in mehrere Untertabellen auf:Die Partitionierung wird verwendet, weil sie die Leistung bestimmter Abfragen verbessert, indem ihnen ermöglicht wird, nur auf einen Teil der Daten zuzugreifen, wodurch sie schneller werden. E/A-Vorgänge können ebenfalls verbessert werden, da Daten und Indizes auf viele Datenträger verteilt werden können.

Es gibt zwei Arten der Partitionierung:horizontal und vertikal. Bei der horizontalen Partitionierung werden verschiedene Zeilen in verschiedene Tabellen eingefügt, bei der vertikalen Partitionierung hingegen werden Tabellen mit weniger Spalten erstellt und zusätzliche Tabellen verwendet, um die verbleibenden Spalten zu speichern.

Wie funktioniert die Partitionierung?

  • Wenn SELECT-Abfragen verwendet werden, öffnet und sperrt die Partitionierungsschicht Partitionen, der Abfrageoptimierer bestimmt, ob eine der Partitionen bereinigt werden kann, dann leitet die Partitionierungsschicht die Handler-API-Aufrufe an die Speicher-Engine weiter, die diese verarbeitet die Partitionen.
  • Wenn INSERT-Abfragen verwendet werden, öffnet und sperrt die Partitionierungsschicht Partitionen, bestimmt, zu welcher Partition die Zeile gehören soll, und leitet die Zeile dann an diese Partition weiter.
  • Wenn DELETE-Abfragen verwendet werden, öffnet und sperrt die Partitionierungsschicht Partitionen, bestimmt, welche Partition die Zeile enthält, und löscht dann die Zeile aus dieser Partition.
  • Wenn UPDATE-Abfragen verwendet werden, öffnet und sperrt die Partitionierungsschicht Partitionen, findet heraus, welche Partition die Zeile enthält, ruft die Zeile ab und ändert sie, bestimmt dann, welche Partition die neue Zeile enthalten soll, und leitet die Zeile weiter in die neue Partition mit einer Einfügungsanfrage und leitet dann die Löschanfrage an die ursprüngliche Partition weiter.

Wann sollten Sie die Partitionierung verwenden?

Im Allgemeinen ist die Partitionierung nützlich, wenn:

  • Sie haben viele Daten, die Sie abfragen müssen.
  • Ihre Tabellen sind zu groß, um in den Arbeitsspeicher zu passen.
  • Ihre Tabellen enthalten historische Daten und neue Daten werden der neuesten Partition hinzugefügt.
  • Sie denken, dass Sie den Inhalt einer Tabelle auf verschiedene Speichergeräte verteilen müssen.
  • Sie denken, dass Sie einzelne Partitionen wiederherstellen müssen.

Wenn eines oder mehrere der oben beschriebenen Szenarien Ihre Situation beschreiben, kann eine Partitionierung hilfreich sein. Bevor Sie Ihre Daten partitionieren, denken Sie jedoch daran, dass MySQL-Partitionen ihre eigenen Einschränkungen haben:

  • Partitionierungsausdrücke erlauben nicht die Verwendung gespeicherter Prozeduren, gespeicherter Funktionen, benutzerdefinierter Funktionen (UDFs) oder Plugins und mit eingeschränkter Unterstützung für SQL-Funktionen. Sie können auch keine deklarierten oder gespeicherten Variablen verwenden.
  • Partitionierte Tabellen dürfen keine Fremdschlüssel enthalten oder von ihnen referenziert werden.
  • Es gibt ein Limit von 1.024 Partitionen pro Tabelle (ab MariaDB 10.0.4 können Tabellen maximal 8.192 Partitionen enthalten).
  • Eine Tabelle kann nur partitioniert werden, wenn die Speicher-Engine Partitionierung unterstützt.
  • Der Abfrage-Cache kennt keine Partitionierung oder Partitionsbereinigung.
  • Alle Partitionen müssen dieselbe Speicher-Engine verwenden.
  • FullTEXT-Indizes werden nicht unterstützt
  • Temporäre Tabellen können nicht partitioniert werden

Die obigen Optionen sollten Ihnen helfen, sich zu entscheiden, ob eine Partitionierung eine Option für Sie ist oder nicht.

Partitionierungstypen

Wenn Sie sich für die Verwendung von Partitionen entscheiden, denken Sie daran, dass Sie aus einer Reihe von Partitionierungstypen wählen können. Wir werden Ihre Optionen unten kurz behandeln und dann tiefer in sie eintauchen:

  • Die Partitionierung nach BEREICH kann Ihnen helfen, Zeilen basierend auf Spaltenwerten zu partitionieren, die in einen bestimmten Bereich fallen.
  • Die Partitionierung nach LIST kann Ihnen helfen, Zeilen basierend auf der Mitgliedschaft von Spaltenwerten in einer bestimmten Liste zu partitionieren.
  • Die Partitionierung nach HASH kann Ihnen helfen, Zeilen basierend auf einem Wert zu partitionieren, der von einem benutzerdefinierten Ausdruck zurückgegeben wird.
  • Partitionierung nach KEY kann Ihnen helfen, Zeilen basierend auf einer von MySQL bereitgestellten Hash-Funktion zu partitionieren.

Partitionierung nach BEREICH

Die Partitionierung nach RANGE ist eine der beliebtesten Formen der Partitionierung von MySQL-Tabellen. Wenn Sie eine Tabelle nach BEREICH partitionieren, partitionieren Sie die Tabelle so, dass jede Partition eine bestimmte Anzahl von Zeilen enthält, die in einen bestimmten Bereich fallen. Um eine Partition zu definieren, definieren Sie ihren Namen und teilen ihr dann mit, welche Werte sie enthalten soll. Um eine Tabelle nach Bereichen zu partitionieren, fügen Sie eine PARTITION BY RANGE-Anweisung hinzu. Wenn Sie beispielsweise Ihre Partition p0 nennen und jeden Wert kleiner als 5 enthalten möchten, müssen Sie sicherstellen, dass Ihre Abfrage PARTITION p0 VALUES LESS THAN (5) enthält. Hier ist ein Beispiel für eine partitionierte Tabelle:

CREATE TABLE sample_table (

id INT(255) NOT NULL AUTO_INCREMENT PRIMARY KEY,

column_name VARCHAR(255) NOT NULL DEFAULT ‘’

...

) PARTITION BY RANGE (column_name) (

PARTITION p0 VALUES LESS THAN (5),

PARTITION p1 VALUES LESS THAN (10),

PARTITION p2 VALUES LESS THAN (15),

PARTITION p3 VALUES LESS THAN (20),

...

);

Sie können auch eine Partition definieren, die alle Werte enthält, die nicht in bestimmte Bereiche fallen, wie folgt:

PARTITION p5 VALUES LESS THAN MAXVALUE

Die obige Partition heißt p5 und enthält alle Werte, die andere Partitionen nicht haben - MAXVALUE stellt einen Wert dar, der immer höher ist als der größtmögliche Wert. Sie können auch Funktionen verwenden, indem Sie Ihre Partitionen wie folgt definieren:

PARTITION BY RANGE (YEAR(date)) (

    PARTITION p0 VALUES LESS THAN (2000),

    PARTITION p1 VALUES LESS THAN (2010),

    PARTITION p2 VALUES LESS THAN (2020),

    PARTITION p3 VALUES LESS THAN MAXVALUE

);

In diesem Fall werden alle Werte, die kleiner als 2000 sind, in der Partition p0 gespeichert, alle Werte, die kleiner als 2010 sind, werden in der Partition p1 gespeichert, alle Werte, die kleiner als 2020 sind, werden in gespeichert die Partition p2 und alle Werte, die in keinen dieser Bereiche fallen, werden in der Partition p3 gespeichert.

Partitionierung nach LIST

Das Partitionieren von MySQL-Tabellen nach LIST ähnelt dem Partitionieren nach RANGE - der Hauptunterschied beim Partitionieren von Tabellen nach LIST besteht darin, dass bei der Partitionierung von Tabellen nach LIST jede Partition basierend auf der Zugehörigkeit zu einem Spaltenwert definiert und ausgewählt wird in einer Reihe von Wertelisten und nicht in einem Bereich von Werten. Die Partitionierung nach LIST kann nützlich sein, wenn Sie beispielsweise wissen, dass Sie über Daten verfügen, die in mehrere kleinere Datensätze (z. B. Regionen) unterteilt werden können. Angenommen, Sie haben ein Geschäft mit 4 Filialen:eine im zentralen Teil der Stadt, die zweite im Norden, die dritte im Osten, die vierte im Westen. Sie können eine Tabelle so partitionieren, dass Daten, die zu einer bestimmten Franchise gehören, in einer Partition gespeichert werden, die dieser Franchise zugeordnet ist:

PARTITION BY LIST(store) (

PARTITION central VALUES IN (1,3,5),

PARTITION north VALUES IN (2,4,7),

PARTITION east VALUES IN (8,9),

PARTITION west VALUES IN (10,11)

);

Partitionierung nach HASH

Das Partitionieren von MySQL-Tabellen nach HASH kann ein Weg sein, um sicherzustellen, dass Daten gleichmäßig über Partitionen verteilt werden. Wenn Sie Ihre Tabellen nach HASH partitionieren, müssen Sie nur angeben, in wie viele Partitionen Ihre Daten aufgeteilt werden sollen - den Rest erledigt MySQL. Sie können die Partitionierung nach HASH verwenden, indem Sie die folgende Anweisung zu CREATE TABLE hinzufügen:

PARTITION BY HASH(id)

PARTITIONS 5;

Ersetzen Sie 5 durch die Zahl, die angibt, in wie viele Partitionen Ihre Daten aufgeteilt werden sollen - die Standardzahl ist 1.

MySQL unterstützt auch die Partitionierung durch LINEAR HASH - lineares Hashing unterscheidet sich von regulärem Hashing, da lineares Hashing einen linearen Potenzen-von-Zwei-Algorithmus verwendet. Um Tabellen nach einem LINEAR HASH zu partitionieren, ersetzen Sie PARTITION BY HASH durch PARTITION BY LINEAR HASH.

Partitionierung nach KEY

Das Partitionieren von MySQL-Tabellen nach KEY ähnelt dem Partitionieren von MySQL-Tabellen nach HASH - in diesem Fall wird die Hash-Funktion für die Schlüsselpartitionierung vom MySQL-Server bereitgestellt. Alle Spalten, die als Partitionierungsschlüssel verwendet werden, müssen den gesamten Primärschlüssel der Tabelle umfassen oder zumindest ein Teil des Primärschlüssels der Tabelle sein. Wenn kein Spaltenname als Partitionierungsschlüssel angegeben ist, wird der Primärschlüssel verwendet. Wenn kein Primärschlüssel, aber ein eindeutiger Schlüssel vorhanden ist, wird stattdessen der eindeutige Schlüssel verwendet. Beispielsweise sind die folgenden Anweisungen beide gültig, obwohl die erste Anweisung nicht einmal den Partitionierungsschlüssel angibt:

CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL DEFAULT ''
)
PARTITION BY KEY()
PARTITIONS 2;
CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
)
PARTITION BY KEY(id)
PARTITIONS 5;

Fazit

Zusammenfassend können Partitionen hilfreich sein, wenn Sie viele Daten haben, Ihre Tabellen zu groß sind, um in den Arbeitsspeicher zu passen, oder wenn sie historische Daten enthalten. Partitionen können auch nützlich sein, wenn Sie glauben, den Inhalt einer Tabelle auf verschiedene Speichermedien verteilen zu müssen, auch wenn Sie die Möglichkeit haben möchten, einzelne Partitionen zu löschen oder wiederherzustellen.

Beachten Sie jedoch, dass Partitionen in MySQL ihre eigenen Nachteile haben. Einer der Hauptnachteile der Partitionierung besteht darin, dass Ihre Tabellen dadurch größer werden – Sie können nicht an Geschwindigkeit gewinnen, ohne Kompromisse beim Speicherplatz einzugehen. Wenn Sie über einen sehr großen Datensatz verfügen, kann dies ein ziemlich großes Problem darstellen.