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 TabelleNachdem 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ügenin 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“); Abfragewä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öschenWenn eine Tabelle gelöscht wird, werden alle Partitionsdateien der Tabelle gelöscht. Ergänzung: Mysql partitioniert automatisch nach MonatstabelleDie beiden wichtigsten gespeicherten Prozeduren:
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:
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:
|
<<: Konfigurationsmethode für die SystemC-Umgebung unter Linux
>>: Lernprogramm zur Verwendung von HTML-Formular-Tags
Aufgrund der Netzwerkisolation kann MySQL nicht m...
Es gibt einen großen Unterschied zwischen der Sch...
Bei der Behebung von Systemproblemen, Anwendungsv...
Inhaltsverzeichnis 1. Anweisung einfügen 1.1 Einf...
MySQL 4.x und höher bieten Unterstützung für die ...
Gibt es in MySQL eine Möglichkeit, Leerzeichen st...
Inhaltsverzeichnis Einzelner Thread asynchron Ein...
Inhaltsverzeichnis Vorwort && Operator ||...
Verwendung von Anker-Tags: Als Ankerlink wird ein ...
Inhaltsverzeichnis 1. Dateien mit Skript-Tags imp...
Ich habe verschiedene Images sowohl unter virtuel...
In diesem Artikel wird der spezifische Code von R...
1. Unterschiede in der Netzwerkkonfiguration zwis...
Vor kurzem sind mehrere Datenanomalien in MySQL o...
Bevor wir beginnen, erstellen wir zwei Tabellen, ...