Heim  >  Artikel  >  Datenbank  >  Kann die Partitionierung von Datenbanktabellen die Einfügeeffizienz verbessern?

Kann die Partitionierung von Datenbanktabellen die Einfügeeffizienz verbessern?

青灯夜游
青灯夜游Original
2020-07-22 11:52:123137Durchsuche

Die Partitionierung von Datenbanktabellen kann die Einfügungseffizienz verbessern; die Partitionierung von Datenbanktabellen kann die Effizienz von Tabellenhinzufügungen, -löschungen, -änderungen und -abfragen verbessern. Das Prinzip des Einfügungsvorgangs für Datenbanktabellenpartitionen: Beim Schreiben eines Datensatzes öffnet und sperrt die Partitionsschicht alle zugrunde liegenden Tabellen, bestimmt dann, welche Partition den Datensatz akzeptiert, und schreibt den Datensatz dann in die entsprechende zugrunde liegende Tabelle.

Kann die Partitionierung von Datenbanktabellen die Einfügeeffizienz verbessern?

Was ist eine Partition?

Partitionierung bedeutet, die Tabelle nach Regeln zu zerlegen und die Daten in Segmente aufzuteilen, um sie an mehreren Orten zu speichern, entweder auf derselben Festplatte oder auf verschiedenen Maschinen. Nach der Partitionierung befindet sich immer noch eine Tabelle auf der Oberfläche, die Daten werden jedoch an mehrere Speicherorte gehasht. Wenn die App liest und schreibt, verarbeitet sie weiterhin den großen Tabellennamen und die Datenbank organisiert automatisch die partitionierten Daten.

Partitionen können in zwei Typen unterteilt werden:

1. Horizontale Partitionierung (horizontale Partitionierung)

Diese Form der Partitionierung dient der Partitionierung der Tabellenzeilen. Auf diese Weise können die durch physische Spalten in verschiedenen Gruppen getrennten Datensätze kombiniert werden, um eine individuelle Partitionierung (einzelne Partition) oder eine kollektive Partitionierung (eine oder mehrere Partitionen) durchzuführen. . Alle in der Tabelle definierten Spalten sind in jedem Datensatz enthalten,

sodass die Eigenschaften der Tabelle weiterhin erhalten bleiben.

Ein einfaches Beispiel: Eine Tabelle mit Rechnungsdatensätzen für zehn Jahre kann in zehn verschiedene Partitionen unterteilt werden, wobei jede Partition Datensätze für eines der Jahre enthält. (Hinweis: Wir werden später über die hier verwendete spezifische Partitionierungsmethode sprechen. Wir können zunächst eines sagen: Sie muss durch eine bestimmte Attributspalte geteilt werden. Die hier verwendete Spalte ist beispielsweise das Jahr.)

2. Vertikale Partitionierung (Vertikale Partitionierung)

Diese Partitionierungsmethode reduziert im Allgemeinen die Breite der Zieltabelle, indem sie die Tabelle vertikal teilt, sodass bestimmte Spalten in bestimmte Partitionen unterteilt werden und jede Partition enthält die Zeilen entsprechen den Spalten.

Nehmen Sie ein einfaches Beispiel: Eine Tabelle enthält große Text- und BLOB-Spalten, auf die nicht häufig zugegriffen wird. Diese selten verwendeten Text- und BLOB-Spalten müssen in eine andere Partition unterteilt werden Zugriffsgeschwindigkeit und stellen gleichzeitig die Korrelation ihrer Daten sicher.

Prinzip der Partitionstabelle

Die Partitionstabelle wird durch mehrere verwandte zugrunde liegende Tabellen implementiert. Diese zugrunde liegenden Tabellen werden auch durch Handle-Objekte dargestellt Sie können die zugrunde liegenden Tabellen der Partition auch direkt auf die gleiche Weise verwalten wie normale Tabellen (alle zugrunde liegenden Tabellen müssen dieselbe Speicher-Engine verwenden). Der Index der Partitionstabelle dient lediglich zum Hinzufügen eines identischen Index zu jeder zugrunde liegenden Tabelle Aus Sicht der Speicher-Engine unterscheidet sich die zugrunde liegende Tabelle nicht von einer gewöhnlichen Tabelle, und die Speicher-Engine muss nicht wissen, ob es sich um eine gewöhnliche Tabelle oder um einen Teil einer partitionierten Tabelle handelt.

Die Operation an der Partitionstabelle wird gemäß der folgenden Operationslogik ausgeführt:

Abfrage auswählen:

Beim Abfragen einer Partitionstabelle wird zuerst die Partitionsschicht geöffnet und gesperrt alle In der zugrunde liegenden Tabelle bestimmt der Optimierer, ob einige Partitionen gefiltert werden können, und ruft dann die entsprechende Speicher-Engine-Schnittstelle auf, um auf die Daten jeder Partition zuzugreifen

Einfügevorgang:

Beim Schreiben eines Datensatzes die Partitionsschicht Öffnen und sperren Sie alle zugrunde liegenden Tabellen, bestimmen Sie dann, welche Partition diesen Datensatz akzeptiert, und schreiben Sie den Datensatz dann in die entsprechende zugrunde liegende Tabelle

Löschvorgang:

Wenn ein Datensatz gelöscht wird, wird der Partitionsschicht Öffnen und sperren Sie zuerst alle zugrunde liegenden Tabellen, bestimmen Sie dann die den Daten entsprechende Partition und löschen Sie schließlich die entsprechende zugrunde liegende Tabelle.

Aktualisierungsvorgang:

Beim Aktualisieren eines Datenelements wird die Partition aktualisiert Die Ebene wird zuerst geöffnet und sperrt alle zugrunde liegenden Tabellen. MySQL bestimmt zunächst, in welcher Partition sich der zu aktualisierende Datensatz befindet, entnimmt dann die Daten und aktualisiert sie, bestimmt dann, in welche Partition die aktualisierten Daten abgelegt werden sollen, und schreibt dann die zugrunde liegende Tabelle und aktualisiert die Originaldaten.

Obwohl jeder Vorgang alle zugrunde liegenden Tabellen öffnet und sperrt, bedeutet dies nicht, dass die Partitionstabelle während der Verarbeitung die gesamte Tabelle sperrt. Wenn die Speicher-Engine Sperren auf Zeilenebene implementieren kann, wie z. B. Innodb, wird die entsprechende Tabellensperre auf Partitionsebene freigegeben. Dieser Sperr- und Entsperrvorgang ähnelt Abfragen bei gewöhnlichem Innodb.

Im folgenden Szenario kann die Aufteilung eine sehr große Rolle spielen:

A: Der Tisch ist zu groß, um alle unterzubringen. Es ist heiß Daten im Speicher oder nur im letzten Teil der Tabelle, und der Rest sind historische Daten

B: Die Daten in der Partitionstabelle sind einfacher zu verwalten, wenn Sie beispielsweise eine große Menge löschen möchten Wenn Sie Daten in Stapeln speichern möchten, können Sie die Methode zum Löschen der gesamten Partition verwenden. Darüber hinaus können Sie auch Optimierungen, Überprüfungen, Reparaturen und andere Vorgänge auf einer unabhängigen Partition durchführen

C: Die Daten der Partitionstabelle können auf verschiedene physische Geräte verteilt werden, wodurch mehrere Hardwaregeräte effizient genutzt werden

D: Sie können Partitionstabellen verwenden, um einige besondere Engpässe zu vermeiden, wie zum Beispiel: sich gegenseitig ausschließender Zugriff auf einen einzelnen Index in innodb, Inode-Sperrkonkurrenz im ext3-Dateisystem usw.

E: Bei Bedarf können Sie kann auch unabhängige Partitionen sichern und wiederherstellen, was in Szenarien mit sehr großen Datenmengen sehr gut funktioniert

F: Optimieren Sie die Abfrage. Wenn die Partitionsspalte in der where-Klausel enthalten ist, können Sie nur die erforderlichen Partitionen verwenden, um die Abfrageeffizienz zu verbessern. Gleichzeitig können Abfragen mit Aggregatfunktionen wie sum() und count( ), können Sie jede hinzufügen. Die Partitionen werden parallel verarbeitet, und am Ende müssen nur die Ergebnisse aller Partitionen zusammengefasst werden.

Die Partition der MySQL-Datenbank behandelt Null immer als einen kleineren Wert als jeden Nicht-Null-Wert. Dies entspricht der Reihenfolge nach Operation in der Datenbank, die Nullwerte verarbeitet steht immer im Vordergrund. Daher behandelt die MySQL-Datenbank für verschiedene Partitionstypen unterschiedlich.

Wenn bei der Bereichspartitionierung null in die Partitionsspalte eingefügt wird, fügt die MySQL-Datenbank den Wert in die Partition ganz links ein. Beachten Sie, dass beim Löschen der Partition der gesamte Inhalt unter der Partition von der Festplatte gelöscht wird . wird die Partition gelöscht, in der sich null befindet, und der Nullwert wird ebenfalls gelöscht.

Um Null in der Listenpartition zu verwenden, muss es explizit im Hashwert der Partition definiert werden, andernfalls wird beim Einfügen von Null ein Fehler gemeldet. Hash- und Schlüsselpartitionen behandeln Null anders als Bereichs- und Listenpartitionen. Jede Partitionsfunktion gibt Null als 0 zurück.

Partition

Partitionierung erfolgt Teilen Sie die Datenbank oder ihre Bestandteile in verschiedene unabhängige Teile auf

--Es handelt sich um eine Methode zur Vororganisation der Tabellenspeicherung

MySQL unterstützt horizontale Partitionierung

Verteilen Sie bestimmte Tabellenzeilen als Teilmengen von Zeilen

Die Verteilung der Partitionen erfolgt über den physischen Speicher

– wie vom Benutzer bei Bedarf festgelegt. Spezifikationsregeln für

– Jede Partition wird als eigene Einheit gespeichert

Aufteilung der Daten

– Daten werden in Teilmengen unterteilt

– Partitionstyp und -ausdruck sind Teil der Tabellendefinition

– Ausdruck kann eine Ganzzahl oder eine Funktion sein, die einen ganzzahligen Wert zurückgibt.

--Dieser Wert bestimmt, in welcher Partition jeder Datensatz gemäß der Definition gespeichert wird

1 Der Primärschlüssel und der eindeutige Schlüssel müssen als Teil des Partitionsschlüssels enthalten sein, andernfalls der Primärschlüssel Schlüssel und eindeutiger Schlüssel werden erstellt. „ERROR 1503 (HY000)“ wird beim Indizieren gemeldet

2. Wenn Sie eine Partition zu einer Bereichspartition hinzufügen, können Sie die Partition erst nach dem Maximalwert anhängen

3. Die Engine aller Partitionen muss gleich sein

4. Bereichspartitionierungsfelder: Ganzzahl, numerischer Ausdruck, Datumsspalte, Datumsfunktionsausdruck (z. B. Jahr(), to_days(), to_seconds( ), unix_timestamp())

Partitionsverwaltung

Partition hinzufügen

ALTER TABLE sale_data
ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));

Partition löschen

–Wenn eine Partition gelöscht wird, werden auch alle Daten in der Partition gelöscht.

ALTER TABLE sale_data DROP PARTITION p201010;

Partitionen zusammenführen

Das folgende SQL führt p201001 – p201009 in 3 Partitionen p2010Q1 – p2010Q3 zusammen

ALTER TABLE sale_data
REORGANIZE PARTITION p201001,p201002,p201003,
p201004,p201005,p201006,
p201007,p201008,p201009 INTO
(
PARTITION p2010Q1 VALUES LESS THAN (201004),
PARTITION p2010Q2 VALUES LESS THAN (201007),
PARTITION p2010Q3 VALUES LESS THAN (201010)
);

Verwandte Empfehlungen: " PHP Tutorial》, „MySQL-Tutorial

Das obige ist der detaillierte Inhalt vonKann die Partitionierung von Datenbanktabellen die Einfügeeffizienz verbessern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn