Teilpartitionierung, auch als zusammengesetzte
Partitionierung bezeichnet, ist die weitere
Unterteilung von Partitionen einer partitionierten Tabelle.
Betrachten Sie als Beispiel die folgende CREATE
TABLE
-Anweisung:
CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE(YEAR(purchased)) SUBPARTITION BY HASH(TO_DAYS(purchased)) SUBPARTITIONS 2 ( PARTITION p0 VALUES LESS THAN (1990), PARTITION p1 VALUES LESS THAN (2000), PARTITION p2 VALUES LESS THAN MAXVALUE );
Die Tabelle ts
hat 3
RANGE
-Partitionen. Jede dieser Partitionen,
also p0
, p1
und
p2
, ist ihrerseits in 2 Teilpartitionen
unterteilt. Im Endeffekt ist die gesamte Tabelle auf 3
* 2 = 6
Partitionen verteilt. Durch die
PARTITION BY RANGE
-Klausel speichern
allerdings die ersten beiden dieser Partitionen nur Datensätze,
die in der purchased
-Spalte einen Wert
kleiner als 1990 aufweisen.
In MySQL 5.1 können Sie Tabellen, die durch
RANGE
oder LIST
partitioniert werden, noch weiter aufteilen. Teilpartitionen
können entweder die HASH
- oder die
KEY
-Partitionierung verwenden. Dies
bezeichnet man auch als zusammengesetzte
Partitionierung.
Außerdem ist es möglich, Teilpartitionen explizit mit
SUBPARTITION
-Klauseln zu definieren, um
Optionen für einzelne Teilpartitionen angeben zu können. So
könnte man dieselbe ts
-Tabelle wie im
vorigen Beispiel auch wortreicher erzeugen:
CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) SUBPARTITION BY HASH( TO_DAYS(purchased) ) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0, SUBPARTITION s1 ), PARTITION p1 VALUES LESS THAN (2000) ( SUBPARTITION s2, SUBPARTITION s3 ), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s4, SUBPARTITION s5 ) );
An dieser Syntax ist Folgendes bemerkenswert:
Jede Partition muss dieselbe Anzahl Teilpartitionen haben.
Wenn Sie mit SUBPARTITION
explizit
Teilpartitionen für eine Partition einer partitionierten
Tabelle definieren, müssen Sie sie für alle anderen auch
definieren. Die folgende Anweisung wird scheitern:
CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) SUBPARTITION BY HASH( TO_DAYS(purchased) ) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0, SUBPARTITION s1 ), PARTITION p1 VALUES LESS THAN (2000), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s2, SUBPARTITION s3 ) );
Die Anweisung würde sogar dann fehlschlagen, wenn sie eine
SUBPARTITIONS 2
-Klausel enthielte.
Jede SUBPARTITION
-Klausel muss
(mindestens) den Namen für die Teilpartition enthalten.
Ansonsten können Sie alle Optionen setzen, die Sie
wünschen, oder aber die Teilpartition mit den
Standardeinstellungen anlegen.
Teilpartitionsnamen müssen innerhalb einer Partition
eindeutig sein, aber nicht innerhalb der Tabelle als Ganzes.
So ist beispielsweise die folgende CREATE
TABLE
-Anweisung zulässig:
CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) SUBPARTITION BY HASH( TO_DAYS(purchased) ) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0, SUBPARTITION s1 ), PARTITION p1 VALUES LESS THAN (2000) ( SUBPARTITION s0, SUBPARTITION s1 ), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s0, SUBPARTITION s1 ) );
Teilpartitionen können bei extrem großen Tabellen helfen, die
Daten und Indizes über viele Festplatten zu verteilen.
Angenommen, Sie haben 6 Festplatten als
/disk0
, /disk1
,
/disk2
und so weiter gemountet. Nun schauen
Sie sich folgendes Beispiel an:
CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) SUBPARTITION BY HASH( TO_DAYS(purchased) ) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0 DATA DIRECTORY = '/disk0/data' INDEX DIRECTORY = '/disk0/idx', SUBPARTITION s1 DATA DIRECTORY = '/disk1/data' INDEX DIRECTORY = '/disk1/idx' ), PARTITION p1 VALUES LESS THAN (2000) ( SUBPARTITION s0 DATA DIRECTORY = '/disk2/data' INDEX DIRECTORY = '/disk2/idx', SUBPARTITION s1 DATA DIRECTORY = '/disk3/data' INDEX DIRECTORY = '/disk3/idx' ), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s0 DATA DIRECTORY = '/disk4/data' INDEX DIRECTORY = '/disk4/idx', SUBPARTITION s1 DATA DIRECTORY = '/disk5/data' INDEX DIRECTORY = '/disk5/idx' ) );
In diesem Fall wird für die Daten und die Indizes jedes
RANGE
eine eigene Festplatte genutzt. Es sind
aber auch viele andere Varianten möglich; ein anderes Beispiel
wäre:
CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE(YEAR(purchased)) SUBPARTITION BY HASH(TO_DAYS(purchased)) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0a DATA DIRECTORY = '/disk0' INDEX DIRECTORY = '/disk1', SUBPARTITION s0b DATA DIRECTORY = '/disk2' INDEX DIRECTORY = '/disk3' ), PARTITION p1 VALUES LESS THAN (2000) ( SUBPARTITION s1a DATA DIRECTORY = '/disk4/data' INDEX DIRECTORY = '/disk4/idx', SUBPARTITION s1b DATA DIRECTORY = '/disk5/data' INDEX DIRECTORY = '/disk5/idx' ), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s2a, SUBPARTITION s2b ) );
Hier wird nach folgenden Regeln gespeichert:
Da Zeilen mit purchased
-Daten aus der
Zeit vor 1990 sehr viel Platz belegen, werden sie auf vier
Arten aufgeteilt, wobei jeweils eine eigene Festplatte den
Daten und Indizes jeder der beiden Teilpartitionen
(s0a
und s0b
) der
Partition p0
gewidmet ist. Mit anderen
Worten:
Die Daten für die Teilpartition s0a
werden auf /disk0
gespeichert.
Die Indizes für die Teilpartition
s0a
werden auf
/disk1
gespeichert.
Die Daten für die Teilpartition s0b
werden auf /disk2
gespeichert.
Die Indizes für die Teilpartition
s0b
werden auf
/disk3
gespeichert.
Die Zeilen mit den Daten der Jahre 1990 bis 1999 (Partition
p1
) belegen nicht so viel Speicher wie
die Daten von vor 1990. So werden sie auf zwei Festplatten
(/disk4
und
/disk5
) verteilt, nicht auf vier, wie
wir es mit den alten in p0
gespeicherten
Daten getan haben:
Die Daten und Indizes der ersten Teilpartition von
p1
(s1a
) werden
auf /disk4
gespeichert, und zwar
die Daten im Verzeichnis
/disk4/data
und die Indizes im
Verzeichnis /disk4/idx
.
Die Daten und Indizes der zweiten Teilpartition von
p1
(s1b
) werden
auf /disk5
gespeichert, und zwar
die Daten im Verzeichnis
/disk5/data
und die Indizes im
Verzeichnis /disk5/idx
.
Die Zeilen der Daten, die die Jahre ab 2000 betreffen
(Partition p2
), nehmen noch weniger
Speicherplatz in Anspruch als die beiden anderen
Datumsbereiche. Zurzeit reicht der Standardspeicherort noch
für sie aus.
Wenn später einmal die Verkaufsdaten für die mit dem Jahr
2000 beginnende Dekade so umfangreich werden, dass der
Standardspeicherort nicht mehr ausreicht, können die
entsprechenden Zeilen mit einer ALTER TABLE ...
REORGANIZE PARTITION
-Anweisung verschoben werden.
Wie das geht, erfahren Sie unter
Abschnitt 17.3, „Partitionsverwaltung“.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.