Die Listenpartitionierung in MySQL ähnelt in vieler Hinsicht
der Bereichspartitionierung. Wie bei dieser muss jede Partition
explizit definiert werden. Der Hauptunterschied besteht darin,
dass bei einer Listenpartitionierung die einzelnen Partitionen
anhand der Frage gebildet werden, ob ein Spaltenwert in einer
von mehreren Wertelisten vorkommt, während
bei der Bereichspartitionierung gefragt wird, ob er in einer von
mehreren Wertefolgen vorkommt. Diese Form
der Partitionierung nehmen Sie mit PARTITION BY
LIST(
vor, wobei
expr
)expr
ein Spaltenwert oder ein auf
einem Spaltenwert basierender Ausdruck ist, der einen Integer
zurückgibt. Die einzelnen Partitionen werden sodann durch
VALUES IN
(
definiert,
wobei value_list
)value_list
eine kommagetrennte
Liste von Integern ist.
Hinweis: In MySQL
5.1 kann der Spaltenwert bei einer
LIST
-Partitionierung nur mit einer
Integer-Liste verglichen werden.
Im Gegensatz zu Bereichspartitionen müssen Listenpartitionen
nicht in einer bestimmten Reihenfolge definiert werden. Genauere
Hinweise zur Syntax finden Sie unter
Abschnitt 13.1.5, „CREATE TABLE
“.
In den nachfolgenden Beispielen gehen wir davon aus, dass die
Grunddefinition der zu partitionierenden Tabelle die der
nachfolgenden CREATE TABLE
-Anweisung ist:
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT '9999-12-31', job_code INT, store_id INT );
(Dies ist dieselbe Tabelle, die auch als Grundlage der Beispiele
in Abschnitt 17.2.1, „RANGE
-Partitionierung“, diente.)
Angenommen, wir haben eine Kette von 20 Videotheken, die auf 4 Franchisenehmer verteilt ist, wie in der folgenden Tabelle gezeigt:
Region | Store ID Numbers |
North | 3, 5, 6, 9, 17 |
East | 1, 2, 10, 11, 19, 20 |
West | 4, 12, 13, 14, 18 |
Central | 7, 8, 15, 16 |
Um diese Tabelle so zu partitionieren, dass jeweils die
Zweigstellen einer Region zusammenhängend gespeichert werden,
könnten Sie die folgende CREATE
TABLE
-Anweisung einsetzen:
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT '9999-12-31', job_code INT, store_id INT ) PARTITION BY LIST(store_id) ( PARTITION pNorth VALUES IN (3,5,6,9,17), PARTITION pEast VALUES IN (1,2,10,11,19,20), PARTITION pWest VALUES IN (4,12,13,14,18), PARTITION pCentral VALUES IN (7,8,15,16) );
Nun ist es ganz einfach, regionale Angestelltendaten in die
Tabelle zu laden oder aus ihr zu löschen. Nehmen wir
beispielsweise an, alle Zweigstellen der Region West werden an
ein anderes Unternehmen verkauft. Dann könnten alle
Angestelltendaten der Zweigstellen dieser Region mit der Anfrage
ALTER TABLE employees DROP PARTITION pWest;
gelöscht werden, die viel schneller als die entsprechende
DELETE
-Anfrage DELETE FROM employees
WHERE store_id IN (4,12,13,14,18);
ausgeführt wird.
Wichtig: Wenn Sie versuchen,
eine Zeile einzufügen, deren Spaltenwert (oder Rückgabewert
für den Partitionierungsausdruck) in den Listen mit den
Partitionierungswerten nicht vorkommt, scheitert die
INSERT
-Anfrage mit einer Fehlermeldung. So
würde beispielsweise die folgende Anfrage bei dem oben
skizzierten Schema einer LIST
-Partitionierung
fehlschlagen:
INSERT INTO employees VALUES (224, 'Linus', 'Torvalds', '2002-05-01', '2004-10-12', 42, 21);
Dieser Fehler tritt ein, da der
store_id
-Spaltenwert 21
in
keiner der Wertelisten auftritt, die zur Definition der
Partitionen pNorth
, pEast
,
pWest
und pCentral
angegeben wurden. Es ist wichtig zu wissen, dass für
Listenpartitionen keine „Catchall“-Definition wie
VALUES LESS THAN MAXVALUE
existiert, um Werte
unterzubringen, die in keiner der Wertelisten auftauchen. Mit
anderen Worten: Jeder Partitionierungswert muss in
einer der Wertelisten vorhanden sein.
Wie die RANGE
-Partitionierung kann auch die
LIST
-Partitionierung mit einer Hash- oder
Schlüsselpartitionierung kombiniert werden, um eine
zusammengesetzte Partitionierung (Teilpartitionierung) zu
bilden. Siehe Abschnitt 17.2.5, „Unterpartitionen“.
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.