Die Partitionierung durch Schlüssel gleicht der Partitionierung
durch Hash, nur dass dort, wo die Hash-Partitionierung einen
benutzerdefinierten Ausdruck verwendet, die
Schlüsselpartitionierung eine vom MySQL Server gelieferte
Hash-Funktion einsetzt. MySQL Cluster verwendet zu diesem Zweck
MD5()
; für Tabellen, die andere
Speicher-Engines benutzen, setzt der Server seine eigene interne
Hash-Funktion ein, die auf demselben Algorithmus wie
PASSWORD()
beruht.
Die Syntaxregeln für CREATE TABLE ... PARTITION BY
KEY
sind dieselben wie bei der Erstellung einer
Hash-partitionierten Tabelle. Die Hauptunterschiede sind:
Statt HASH
wird KEY
eingesetzt.
KEY
nimmt nur eine Liste mit einem oder
mehreren Spaltennamen entgegen. Seit MySQL 5.1.5 müssen die
Spalten, die als Partitionierungsschlüssel eingesetzt
werden, den Primärschlüssel der Tabelle (sofern sie einen
hat) ganz oder teilweise abdecken.
Seit MySQL 5.1.6 nimmt KEY
eine Liste mit
null oder mehr Spaltennamen entgegen. Wenn kein Spaltenname
als Partitionierungsschlüssel angegeben ist, wird der
Primärschlüssel der Tabelle verwendet. Die folgende
CREATE TABLE
-Anweisung gilt
beispielsweise in MySQL 5.1.6 oder höher:
CREATE TABLE k1 ( id INT NOT NULL PRIMARY KEY, name VARCHAR(20) ) PARTITION BY KEY() PARTITIONS 2;
In diesem Fall ist der Partitionierungsschlüssel die Spalte
id
, auch wenn das in der Ausgabe von
SHOW CREATE TABLE
oder in der Spalte
PARTITION_EXPRESSION
der Tabelle
INFORMATION_SCHEMA.PARTITIONS
nicht
erkennbar ist.
Hinweis: Seit MySQL 5.1.6
werden außerdem Tabellen, die die Speicher-Engine
NDB Cluster
verwenden, implizit mit
KEY
partitioniert, wobei auch hier wieder
der Primärschlüssel der Tabelle als
Partitionierungsschlüssel dient. Nehmen wir als Beispiel
die Tabelle, die mit folgender Anweisung erzeugt wird:
CREATE TABLE kndb ( id INT NOT NULL PRIMARY KEY, name VARCHAR(20) NOT NULL ) ENGINE=NDBCLUSTER;
Obwohl die Anweisung keine PARTITION
BY
-Klausel enthält, zeigt die Ausgabe von
SHOW CREATE TABLE kndb
Folgendes an:
CREATE TABLE `kndb` ( `id` int(11) NOT NULL, `name` varchar(20) NOT NULL. PRIMARY KEY (`id`) ) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ();
Falls die Cluster-Tabelle keinen expliziten
Primärschlüssel hat, wird der „verborgene“
Primärschlüssel, den die Speicher-Engine
NDB
automatisch für jede Cluster-Tabelle
generiert, als Partitionierungsschlüssel eingesetzt.
Wichtig: Auf einer
schlüsselpartitionierten Tabelle, die eine andere
Speicher-Engine als NDB CLuster
verwendet, können Sie keine ALTER TABLE DROP
PRIMARY KEY
-Anweisung ausführen, ansonsten tritt
der Fehler ERROR 1466 (HY000): Field in list of
fields for partition function not found in table
ein. Dieses Problem betrifft keine MySQL CLuster-Tabellen,
die durch KEY
partitioniert werden: In
solchen Fällen wird die Tabelle reorganisiert, wobei der
„verborgene“ Primärschlüssel als neuer
Partitionierungsschlüssel der Tabelle verwendet wird. Siehe
Kapitel 16, MySQL Cluster.
Es ist auch möglich, eine Tabelle durch linearen Schlüssel zu partitionieren. Hier sehen Sie ein einfaches Beispiel:
CREATE TABLE tk ( col1 INT NOT NULL, col2 CHAR(5), col3 DATE ) PARTITION BY LINEAR KEY (col1) PARTITIONS 3;
Die Verwendung von LINEAR
hat auf die
KEY
-Partitionierung denselben Effekt wie auf
die HASH
-Partitionierung, wobei die
Partitionsnummer mit einem Zweierpotenz-Algorithmus anstatt mit
Modulo-Arithmetik abgeleitet wird. Eine Beschreibung dieses
Algorithmus und seiner Implikationen finden Sie unter
Abschnitt 17.2.3.1, „LINEAR HASH
-Partitionierung“.
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.