Dieser Abschnitt gibt einen Überblick über Partitionierungskonzepte in MySQL 5.1.
Beschränkungen der Partitionierung und die Grenzen des Features erfahren Sie unter Abschnitt 17.4, „Beschränkungen und Grenzen der Partitionierung“.
Der SQL-Standard enthält kaum Anleitungen in Bezug auf die
physikalischen Aspekte der Datenspeicherung. Die Sprache SQL ist
dafür ausgelegt, unabhängig von Datenstrukturen, Medien sowie
den einem Schema zugrunde liegenden Tabellen, Zeilen oder Spalten
zu funktionieren. Allerdings haben die meisten modernen
Datenbankmanagementsysteme auch irgendwelche Möglichkeiten
entwickelt, um festzustellen, an welchem Ort (Dateisystem,
Hardware oder beides) bestimmte Daten physikalisch gespeichert
werden. In MySQL unterstützte die Speicher-Engine
InnoDB
lange Zeit Tablespaces und der MySQL
Server konnte schon vor der Einführung von Partitionierung so
konfiguriert werden, dass er für die Speicherung
unterschiedlicher Datenbanken verschiedene physikalische
Verzeichnisse verwendete (unter Abschnitt 7.6.1, „Symbolische Verknüpfungen“,
werden die Gründe dafür erklärt).
Mit der Partitionierung wird dieses Konzept
noch einen Schritt weitergeführt: Hiermit können Sie
verschiedene Teile einzelner Tabellen über ein Dateisystem
verteilen, und zwar nach Regeln, die Sie im Großen und Ganzen
nach Ihren Bedürfnissen festlegen. So werden verschiedene Teile
einer Tabelle im Endeffekt als getrennte Tabellen an verschiedenen
Stellen gespeichert. Die vom Benutzer gewählte Regel, nach
welcher die Daten aufgeteilt werden, bezeichnet man als
Partitionierungsfunktion. Diese kann in
MySQL der Modulus sein, ein einfacher Vergleich mit einer Menge
von Wertebereichen oder Wertelisten, oder auch eine interne oder
lineare Hash-Funktion. Die Funktion wird je nach dem vom Benutzer
angegebenen Partitionierungstyp ausgewählt und nimmt den Wert
eines ebenfalls vom Benutzer gelieferten Ausdrucks als Parameter
entgegen. Dieser Ausdruck kann der Wert einer Integer-Spalte sein
oder auch eine Funktion, die auf einer oder mehreren Spalten
arbeitet und einen Integer zurückgibt. Der Wert dieses Ausdrucks
wird an die Partitionierungsfunktion übergeben, die ihrerseits
die Nummer der Partition, in welcher dieser spezielle Datensatz
gespeichert werden soll, als Integer zurückgibt. Diese Funktion
muss nichtkonstant und nichtzufällig sein. Sie darf keine
Anfragen enthalten, kann aber jedweden in MySQL zulässigen
SQL-Ausdruck enthalten, wenn dieser nur einen positiven Integer
kleiner MAXVALUE
zurückgibt (dies ist der
größtmögliche positive Integer). Beispiele für
Partitionierungsfunktionen finden Sie in den Abschnitten über
Partitionierungstypen weiter unten in diesem Kapitel (siehe
Abschnitt 17.2, „Partitionstypen“) sowie in den Beschreibungen
zur Partitionierungssyntax in Abschnitt 13.1.5, „CREATE TABLE
“.
Dies bezeichnet man als horizontale Partitionierung: Verschiedene Zeilen einer Tabelle können unterschiedlichen physikalischen Partitionen zugewiesen werden. MySQL 5.1 kennt keine vertikale Partitionierung, bei der verschiedene Tabellenspalten auf verschiedene physikalische Partitionen gespeichert würden. Es gibt auch noch keinerlei Pläne, vertikale Partitionierung in MySQL 5.1 einzuführen.
Partitionierungsunterstützung ist in den
-max
-Releases von MySQL 5.1
enthalten (d. h., dass die 5.1--max
-Binaries
mit der Option --with-partition
erstellt werden).
Wenn die MySQL-Binary mit Partitionierungsunterstützung gebaut
wird, muss nichts weiter unternommen werden, um diese zu
aktivieren (es sind beispielsweise keine speziellen Einträge in
der my.cnf
-Datei erforderlich). Ob Ihr MySQL
Server Partitionierung unterstützt, verrät Ihnen der Befehl
SHOW VARIABLES
:
mysql> SHOW VARIABLES LIKE '%partition%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| have_partitioning | YES |
+-------------------+-------+
1 row in set (0.00 sec)
Wenn Sie in der Ausgabe Ihres ensprechenden SHOW
VARIABLES
-Befehls nicht wie hier eine
have_partitioning
-Variable mit dem Wert
YES
zu sehen bekommen, dann unterstützt Ihre
MySQL-Version keine Partitionierung.
Vor MySQL 5.1.6 hieß diese Variable
have_partition_engine
(Bug#16718).
Um partitionierte Tabellen zu erstellen, können Sie jede vom
MySQL Server unterstützte Speicher-Engine einsetzen; die
MySQL-Partitionierungs-Engine läuft in ihrer eigenen Schicht und
kann mit allen diesen Speicher-Engines umgehen. In MySQL
5.1 müssen alle Partitionen derselben
partitionierten Tabelle auch dieselbe Speicher-Engine benutzen.
Sie können beispielsweise nicht für die eine Partition
MyISAM
und für die andere
InnoDB
benutzen. Allerdings hindert nichts Sie
daran, verschiedene Speicher-Engines für verschiedene
partitionierte Tabellen auf demselben MySQL Server oder sogar in
derselben Datenbank zu benutzen.
Um eine bestimmte Speicher-Engine für eine partitionierte Tabelle
zu verwenden, müssen Sie lediglich die passende
[STORAGE] ENGINE
-Option einstellen, wie Sie es
auch bei einer nichtpartitionierten Tabelle tun würden.
Allerdings müssen Sie daran denken, dass [STORAGE]
ENGINE
(und andere Tabellenoptionen) in einer
CREATE TABLE
-Anweisung vor
den Partitionierungsoptionen stehen müssen. Das folgende Beispiel
zeigt, wie man eine Tabelle anlegt, die per Hash in 6 Partitionen
zerlegt wird und die Speicher-Engine InnoDB
verwendet:
CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE) ENGINE=INNODB PARTITION BY HASH(MONTH(tr_date)) PARTITIONS 6;
(Beachten Sie, dass jede PARTITION
-Klausel auch
eine [STORAGE] ENGINE
-Option enthalten kann,
die jedoch in MySQL 5.1 wirkungslos bleibt.)
Es ist durchaus möglich, auch partitionierte temporäre Tabellen zu erstellen, doch diese haben nur so lange wie die aktuelle MySQL-Session Bestand. Dasselbe gilt für nichtpartitionierte temporäre Tabellen.
Hinweis: Eine Partitionierung betrifft alle Daten und Indizes einer Tabelle. Sie können weder die Daten ohne ihre Indizes partitionieren noch die Indizes ohne die Daten, ebenso wenig, wie Sie nur einen Teil einer Tabelle partitionieren können.
Die Daten und Indizes jeder Partition können mit den Optionen
DATA DIRECTORY
und INDEX
DIRECTORY
der PARTITION
-Klausel der
CREATE TABLE
-Anweisung, mit der die
partitionierte Tabelle angelegt wird, einem bestimmten Verzeichnis
zugewiesen werden. Überdies können Sie mit
MAX_ROWS
und MIN_ROWS
festlegen, wie viele Zeilen höchstens bzw. mindestens in jeder
Partition gespeichert werden dürfen. Genaueres über diese
Optionen erfahren Sie unter
Abschnitt 17.3, „Partitionsverwaltung“.
Hinweis: Dieses Feature läuft
zurzeit wegen Bug#13250 nicht; dies dürfte jedoch behoben sein,
wenn die ersten 5.1-Binaries zur Verfügung gestellt werden.
Eine Partitionierung hat folgende Vorteile:
In einer einzigen Tabelle können mehr Daten gespeichert werden, als auf eine einzelne Festplatte oder Dateisystempartition passen.
Unnütz gewordene Daten lassen sich oft einfacher aus der Tabelle entfernen, wenn man nur eine Partition löschen muss, die ebendiese Daten enthält. Umgekehrt lassen sich in einigen Fällen Daten auch einfacher hinzufügen, indem man einfach eine neue Partition speziell für diese Daten erschafft.
Normalerweise bietet eine Partitionierung auch noch die in der folgenden Liste aufgeführten Vorteile. Diese Features sind zwar in MySQL Partitioning noch nicht implementiert, stehen aber ganz oben auf unserer Prioritätenliste. Wir hoffen, sie im Produktionsrelease der Version 5.1 bereits einbringen zu können.
Manche Anfragen lassen sich dadurch optimieren, dass die
Daten, die auf eine WHERE
-Klausel
zutreffen, auf bestimmten Partitionen gespeichert werden
können, wodurch die restlichen Partitionen von der Suche
ausgeschlossen bleiben. Da Partitionen nach der Erstellung
einer partitionierten Tabelle geändert werden können, sind
Sie in der Lage, Ihre Daten so zu reorganisieren, dass
häufige Anfragen schneller verarbeitet werden, als es im
ursprünglichen Partitionierungsschema der Fall war.
Anfragen mit Aggregatfunktionen wie SUM()
und COUNT()
lassen sich leicht
parallelisieren. Ein einfaches Beispiel einer solchen Anfrage
wäre SELECT salesperson_id, COUNT(orders) as
order_total FROM sales GROUP BY salesperson_id;
. Mit
„parallelisieren“ ist gemeint, dass die Anfrage
auf allen Partitionen gleichzeitig ausgeführt werden kann und
das Endergebnis dann die Summe der Resultate der einzelnen
Partitionen ist.
Da Suchoperationen auf mehrere Festplatten verteilt werden können, wird ein größerer Durchsatz an Anfragen erzielt.
Bitte schauen Sie regelmäßig im englischsprachingen Handbuch, Kapitel „Partitions“, nach aktuellen Entwicklungen in der Implementierung der Partitionierung in MySQL 5.1, da diese Entwicklung noch nicht abgeschlossen ist.
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.