Die MySQL-Partitionstabelle ist nach Monaten klassifiziert

Die MySQL-Partitionstabelle ist nach Monaten klassifiziert

Es wird empfohlen, dass das Datenvolumen einer einzelnen MySQL-Tabelle 20 Millionen Zeilen nicht überschreitet, da dies sonst erhebliche Auswirkungen auf die Leistung hat. Ich habe vor kurzem ein Projekt mit einer einzigen Tabelle übernommen, die über 70 Millionen Datenzeilen enthielt. Eine einfache Abfrage benötigte mehr als 50 Minuten, um Ergebnisse zu liefern, was wirklich frustrierend war. Am Ende entschieden wir uns, eine partitionierte Tabelle zu verwenden.

Erstellen einer Tabelle

Nachdem eine allgemeine Tabelle (innodb) erstellt wurde, gibt es nur eine IDB-Datei:

Tabelle erstellen normal_table(id int Primärschlüssel, kein int)

Zeigen Sie die Datenbankdatei an:

normal_table.ibd  

Erstellen Sie eine nach Monaten partitionierte Partitionstabelle, Achtung! Zusätzlich zum normalen Primärschlüssel muss auch das Monatsfeld (das Feld, das zur Partitionierung verwendet wird) der Primärschlüssel sein:

Tabelle erstellen partition_table(id int AUTO_INCREMENT, create_date date, name varchar(10), 
Primärschlüssel (ID, Erstellungsdatum)) ENGINE=INNODB DEFAULT CHARSET=utf8 
Partition nach Bereich (Monat (Erstellungsdatum)) (
Der Wert der Partition quarter1 ist kleiner als (4),
Partitionsquartal2-Werte kleiner als (7),
Partitionsquartal3-Werte kleiner als (10),
Partitionsquartal4 Werte kleiner als(13)
);

Zeigen Sie die Datenbankdatei an:

partition_table#p#quarter1.ibd  
partition_table#p#quarter2.ibd  
partition_table#p#quarter3.ibd  
partition_table#p#quarter4.ibd

einfügen

in Partitionstabelle einfügen (Erstellungsdatum, Name) Werte („25.01.2021“, „tom1“);
in Partitionstabelle einfügen (Erstellungsdatum, Name) Werte („25.02.2021“, „tom2“);
in Partitionstabelle einfügen (Erstellungsdatum, Name) Werte („25.03.2021“, „tom3“);
in Partitionstabelle einfügen (Erstellungsdatum, Name) Werte („25.04.2021“, „tom4“);
in Partitionstabelle einfügen (Erstellungsdatum, Name) Werte („25.05.2021“, „tom5“);
in Partitionstabelle einfügen (Erstellungsdatum, Name) Werte („25.06.2021“, „tom6“);
in Partitionstabelle einfügen (Erstellungsdatum, Name) Werte („25.07.2021“, „tom7“);
in Partitionstabelle einfügen (Erstellungsdatum, Name) Werte („25.08.2021“, „tom8“);
in Partitionstabelle einfügen (Erstellungsdatum, Name) Werte („25.09.2021“, „tom9“);
in Partitionstabelle einfügen (Erstellungsdatum, Name) Werte („25.10.2021“, „tom10“);
in Partitionstabelle einfügen (Erstellungsdatum, Name) Werte („25.11.2021“, „tom11“);
in Partitionstabelle einfügen (Erstellungsdatum, Name) Werte („25.12.2021“, „tom12“);

Abfrage

wähle count(*) aus partition_table;
> 12

 
Abfrage der Daten der zweiten Partition (zweites Quartal):
Wählen Sie * aus der Partitionstabelle PARTITION (Quartal2);

4 25.04.2021 tom4
5 25.05.2021 tom5
6 25. Juni 2021 tom6

löschen

Wenn eine Tabelle gelöscht wird, werden alle Partitionsdateien der Tabelle gelöscht.

Ergänzung: Mysql partitioniert automatisch nach Monatstabelle

Die beiden wichtigsten gespeicherten Prozeduren:

  • auto_create_partition dient zum Erstellen von Tabellenpartitionen. Nach dem Aufruf werden Tabellenpartitionen für die Tabelle bis zum Ende des nächsten Monats erstellt.
  • auto_del_partition wird zum Löschen von Tabellenpartitionen verwendet, um die Wiederherstellung des historischen Datenspeicherplatzes zu erleichtern.
TRENNUNGSZEICHEN $$
DROP-PROZEDUR, WENN EXISTIERT auto_create_partition$$
ERSTELLEN SIE DAS VERFAHREN `auto_create_partition` (IN `table_name` varchar(64))
BEGINNEN
   SET @next_month:=CONCAT(date_format(date_add(now(),Intervall 2 Monate),'%Y%m'),'01');
   SET @SQL = CONCAT( 'ALTER TABLE `', Tabellenname, '`',
     ' ADD PARTITION (PARTITION p', @next_month, " WERTE WENIGER ALS (TO_DAYS(",
       @nächster_Monat ,")) );" );
   STMT AUS @SQL VORBEREITEN;
   STMT AUSFÜHREN;
   Zuordnung freigeben, STMT vorbereiten;
ENDE$$

DROP-PROZEDUR, WENN EXISTIERT auto_del_partition$$
PROZEDUR `auto_del_partition` ERSTELLEN (IN `table_name` varchar(64), IN `reserved_month` int)
BEGINNEN
 DECLARE v_finished INTEGER DEFAULT 0;
 DECLARE v_Teilename varchar(100) DEFAULT "";
 DECLARE part_cursor CURSOR FÜR 
  Wählen Sie Partitionsname aus Information_schema.Partitions, wobei Table_Schema = Schema() ist.
   und table_name=@table_name und partition_description < TO_DAYS(CONCAT(date_format(date_sub(now(),interval reserved_month month),'%Y%m'),'01'));
 DECLARE continue-Handler FÜR 
  NICHT GEFUNDEN SET v_finished = TRUE;
 ÖFFNEN Sie Teilcursor;
read_loop: SCHLEIFE
 FETCH Teilecursor INTO v_Teilename;
 wenn v_finished = 1 dann
  verlasse read_loop;
 Ende wenn;
 SET @SQL = CONCAT( 'ALTER TABLE `', Tabellenname, '` DROP PARTITION ', v_Teilename, ";" );
 STMT AUS @SQL VORBEREITEN;
 STMT AUSFÜHREN;
 Zuordnung freigeben, STMT vorbereiten;
 ENDE DER SCHLEIFE;
 SCHLIESSEN Sie part_cursor;
ENDE$$

TRENNUNGSZEICHEN ;

Hier ist ein Beispiel

-- Angenommen, es gibt eine Tabelle mit dem Namen „Records“. Legen Sie die Partitionsbedingung auf „Partitionierung nach Monat nach Endzeit“ fest. DROP TABLE IF EXISTS „Records“;
CREATE TABLE `Datensätze` (
  `id` int(11) NICHT NULL AUTO_INCREMENT,
  `start_time` datetime NICHT NULL,
  `end_time` datetime NICHT NULL,
  `memo` varchar(128) ZEICHENSATZ utf8mb4 NICHT NULL,
  PRIMÄRSCHLÜSSEL (`id`,`end_time`)
) 
PARTITION NACH BEREICH (BIS_TAGE(Endzeit))(
 PARTITION p20200801 WERTE KLEINER ALS (TO_DAYS('20200801'))
);

EREIGNIS LÖSCHEN, WENN `records_auto_partition` EXISTIERT;

-- Erstellen Sie ein Ereignis, das einmal im Monat ausgeführt wird und bis zu 6 Monate Daten speichert. DELIMITER $$
EREIGNIS `records_auto_partition` ERSTELLEN
PLANMÄSSIG ALLE 1 MONATE NACH FERTIGSTELLUNG ERHALTEN
AKTIVIEREN
TUN
BEGINNEN
rufen Sie auto_create_partition('Datensätze') auf;
Rufen Sie auto_del_partition('records',6) auf;
ENDE$$
TRENNUNGSZEICHEN ;

Einige Anmerkungen:

  • Für MySQL 5.1 und höher muss das Indexfeld der Tabellenpartition der Primärschlüssel sein.
  • In einer gespeicherten Prozedur muss auf DECLARE BEGIN folgen, sonst wird ein unverständlicher Fehler gemeldet.
  • Der Cursor DECLARE muss nach der Definitionsanweisung stehen, sonst wird ein Fehler gemeldet
  • Wenn Sie MySQL selbst installiert haben, ist die Ereignisfunktion möglicherweise nicht aktiviert und beim Erstellen eines Ereignisses wird eine Fehlermeldung angezeigt. Ändern Sie my.cnf, fügen Sie event_scheduler=1 unter [mysqld] hinzu und starten Sie neu.

Dies ist das Ende dieses Artikels über die Implementierung einer monatlichen Klassifizierung in MySQL-partitionierten Tabellen. Weitere Informationen zu MySQL-partitionierten Tabellen nach Monaten finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Warum muss der Partitionsschlüssel in einer MySQL-Partitionstabelle Teil des Primärschlüssels sein?
  • Ein Leistungsfehler bei MySQL-Partitionstabellen
  • Detaillierte Erklärung der MySQL-Partitionstabelle
  • Verwaltung und Wartung von Mysql-Partitionstabellen
  • MySQL-Optimierungspartitionstabelle
  • Zusammenfassung der MySQL-Partitionstabellenverwaltungsbefehle

<<:  Konfigurationsmethode für die SystemC-Umgebung unter Linux

>>:  Lernprogramm zur Verwendung von HTML-Formular-Tags

Artikel empfehlen

Offlineinstallation von Centos7.2 mysql5.7.18.tar.gz

Aufgrund der Netzwerkisolation kann MySQL nicht m...

So überprüfen Sie die Speichernutzung unter Linux

Bei der Behebung von Systemproblemen, Anwendungsv...

MySQL-Lerndatenbankbetrieb DML ausführliche Erklärung für Anfänger

Inhaltsverzeichnis 1. Anweisung einfügen 1.1 Einf...

Beispiel für die MySQL-Volltext-Fuzzy-Suche nach der Methode MATCH AGAINST

MySQL 4.x und höher bieten Unterstützung für die ...

MySQL-Batch entfernt Leerzeichen in einem bestimmten Feld

Gibt es in MySQL eine Möglichkeit, Leerzeichen st...

Beispiele für die Verwendung der Operatoren && und || in JavaScript

Inhaltsverzeichnis Vorwort && Operator ||...

Beispiel für die gemeinsame Nutzung von Anker-Tags in HTML

Verwendung von Anker-Tags: Als Ankerlink wird ein ...

Javascript verwendet das Integritätsattribut zur Sicherheitsüberprüfung

Inhaltsverzeichnis 1. Dateien mit Skript-Tags imp...

VMware12.0-Installation Ubuntu14.04 LTS-Tutorial

Ich habe verschiedene Images sowohl unter virtuel...

React + ts realisiert den sekundären Verknüpfungseffekt

In diesem Artikel wird der spezifische Code von R...

Implementierung der CentOS8.0-Netzwerkkonfiguration

1. Unterschiede in der Netzwerkkonfiguration zwis...

Eine detaillierte Diskussion über MySQL-Deadlocks und -Logs

Vor kurzem sind mehrere Datenanomalien in MySQL o...

Zusammenfassung der sieben MySQL JOIN-Typen

Bevor wir beginnen, erstellen wir zwei Tabellen, ...