MySQL - Vertikale Partitionierung

Hallo, angehende Datenbankenthusiasten! Heute tauchen wir ein in die faszinierende Welt der MySQL-vertikalen Partitionierung. Als dein freundlicher Nachbarschafts-Computerlehrer freue ich mich darauf, dich auf dieser Reise zu führen, selbst wenn du完全 neu im Programmieren bist. Keine Sorge; wir gehen schrittweise vor, und bevor du es merkst, wirst du Daten wie ein Profi partitionieren!

MySQL - Vertical Partitioning

Die MySQL-Vertikale Partitionierung

Stell dir vor, du hast eine große Kiste mit Spielzeug (das ist unsere Datenbank), und du möchtest sie besser organisieren. Vertikale Partitionierung ist so, als ob du dein Spielzeug in verschiedene kleinere Kisten nach ihren Eigenschaften einteilst. In Datenbankterminologie ist es der Prozess der Aufteilung der Spalten einer Tabelle in separate Tabellen.

Lass uns mit einem einfachen Beispiel beginnen:

CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
email VARCHAR(100),
phone VARCHAR(20),
address TEXT
);

Dies ist unsere ursprüngliche students-Tabelle. Nun wenden wir vertikale Partitionierung an:

CREATE TABLE students_main (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT
);

CREATE TABLE students_contact (
id INT PRIMARY KEY,
email VARCHAR(100),
phone VARCHAR(20)
);

CREATE TABLE students_address (
id INT PRIMARY KEY,
address TEXT
);

Hier haben wir unsere ursprüngliche Tabelle in drei kleinere Tabellen aufgeteilt. Dies kann die Leistung verbessern, insbesondere wenn du nur bestimmte Spalten häufig abfragst.

Warum vertikale Partitionierung verwenden?

  1. Verbesserte Abfragleistung
  2. Bessere Datenverwaltung
  3. Erhöhte Sicherheit (du kannst den Zugriff auf sensible Daten einschränken)

Nun schauen wir, wie wir Daten mit dieser neuen Struktur einfügen und abrufen können:

-- Daten einfügen
INSERT INTO students_main VALUES (1, 'Alice', 20);
INSERT INTO students_contact VALUES (1, '[email protected]', '123-456-7890');
INSERT INTO students_address VALUES (1, '123 Main St, Anytown, USA');

-- Daten abrufen
SELECT m.id, m.name, c.email, a.address
FROM students_main m
JOIN students_contact c ON m.id = c.id
JOIN students_address a ON m.id = a.id
WHERE m.id = 1;

Auf diese Weise kannst du alle Informationen über einen Schüler erhalten, aber sie werden effizienter gespeichert.

Range-Spalten-Partitionierung

Nun eine Stufe höher und reden wir über Range-Spalten-Partitionierung. Das ist so, als ob du deine Bücher nach dem Jahr ihrer Veröffentlichung organisierst, aber für mehrere Spalten.

Hier ist ein Beispiel mit einer sales-Tabelle:

CREATE TABLE sales (
id INT NOT NULL,
sale_date DATE NOT NULL,
amount DECIMAL(10,2) NOT NULL
)
PARTITION BY RANGE COLUMNS(sale_date, amount) (
PARTITION p0 VALUES LESS THAN ('2023-01-01', 1000),
PARTITION p1 VALUES LESS THAN ('2023-01-01', 5000),
PARTITION p2 VALUES LESS THAN ('2023-07-01', 1000),
PARTITION p3 VALUES LESS THAN ('2023-07-01', 5000),
PARTITION p4 VALUES LESS THAN (MAXVALUE, MAXVALUE)
);

In diesem Beispiel partitionieren wir basierend auf sale_date und amount. Dies ermöglicht eine feinere Kontrolle darüber, wie die Daten verteilt werden.

Lassen wir einige Daten einfügen und schauen, wie es funktioniert:

INSERT INTO sales VALUES
(1, '2022-12-15', 500),
(2, '2022-12-20', 2000),
(3, '2023-03-10', 800),
(4, '2023-03-15', 3000),
(5, '2023-08-01', 1500);

-- Lassen wir überprüfen, in welche Partition jeder Eintrag kommt
SELECT *, PARTITION_NAME FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'sales';

Diese Abfrage zeigt dir, zu welcher Partition jeder Eintrag basierend auf unseren Range-Kriterien zugewiesen wurde.

Listenspalten-Partitionierung

Last but not least, lassen wir uns der Listenspalten-Partitionierung widmen. Das ist so, als ob du deine Kleidung nach Farbe und Art sortierst – du kannst einen Schrank für rote Shirts haben, einen anderen für blaue Hosen und so weiter.

Hier ist ein Beispiel mit einer products-Tabelle:

CREATE TABLE products (
id INT NOT NULL,
name VARCHAR(50),
category VARCHAR(20),
sub_category VARCHAR(20)
)
PARTITION BY LIST COLUMNS(category, sub_category) (
PARTITION p_electronics VALUES IN (('Electronics', 'Phones'), ('Electronics', 'Laptops')),
PARTITION p_clothing VALUES IN (('Clothing', 'Shirts'), ('Clothing', 'Pants')),
PARTITION p_other VALUES IN (('Books', 'Fiction'), ('Books', 'Non-fiction'))
);

Nun fügen wir einige Produkte hinzu:

INSERT INTO products VALUES
(1, 'iPhone 12', 'Electronics', 'Phones'),
(2, 'MacBook Pro', 'Electronics', 'Laptops'),
(3, 'Levi\'s Jeans', 'Clothing', 'Pants'),
(4, 'Harry Potter', 'Books', 'Fiction');

-- Lassen wir überprüfen, in welche Partition jedes Produkt kommt
SELECT *, PARTITION_NAME FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'products';

Diese Abfrage zeigt dir, wie jedes Produkt basierend auf seiner Kategorie und Unterkategorie in seine respective Partition sortiert wurde.

Vergleich der Partitionierungsmethoden

Methode Anwendungsfall Vorteile Nachteile
Vertikale Partitionierung Große Tabellen mit selten genutzten Spalten Verbesserte Abfragleistung, bessere Datenverwaltung Komplexere Joins für die vollständige Datenerfassung
Range-Spalten-Partitionierung Zeitbasierte oder numerische Range-Daten Effizient für range-basierte Abfragen, gut für historische Daten Potenzial für unregelmäßige Datenverteilung
Listenspalten-Partitionierung Kategorisierte Daten mit mehreren Attributen Präzise Kontrolle über die Datenplatzierung, gut für komplexe Kategorisierungen Kann unübersichtlich werden mit vielen Kategorien

Und das war's, Leute! Wir haben die Welt der MySQL-vertikalen Partitionierung durchquert, die Bereiche der Range-Spalten-Partitionierung erkundet und uns in das Gebiet der Listenspalten-Partitionierung vorgewagt. Denke daran, wie beim Organisieren deines Zimmers, der Schlüssel zu einer guten Datenbankgestaltung darin besteht, Dinge dort zu platzieren, wo sie am meisten Sinn ergeben und am einfachsten zu finden sind. Übe weiter, und bald wirst du ein Datenbank-Organisations-Zauberer sein!

Credits: Image by storyset