Übersicht über partitionierte MySQL-Tabellen Wir stoßen häufig auf Tabellen, in denen Hunderte Millionen oder sogar Milliarden Datensätze gespeichert sind. In diesen Tabellen werden große Mengen historischer Datensätze gespeichert. Das Bereinigen dieser historischen Daten ist mühsam, da sich alle Daten in einer gemeinsamen Tabelle befinden. Daher können Sie zum Löschen nur eine oder mehrere Löschanweisungen mit Where-Bedingungen aktivieren (normalerweise ist die Where-Bedingung die Zeit). Dies belastet die Datenbank stark. Obwohl wir diese entfernt haben, wurden die zugrunde liegenden Datendateien nicht kleiner. Bei Problemen dieser Art ist die Verwendung der Partitionstabelle die effektivste Lösung. Die gebräuchlichste Partitionierungsmethode ist die Partitionierung nach Zeit. Einer der größten Vorteile der Partitionierung besteht darin, dass historische Daten sehr effizient bereinigt werden können. 1. Bestätigen Sie, ob der MySQL-Server Partitionstabellen unterstützt Befehl: Plugins anzeigen; 2. Eigenschaften von MySQL-Partitionstabellen Logisch handelt es sich um eine Tabelle, physisch ist sie jedoch in mehreren Dateien gespeichert. HASH-Partition (HASH) Eigenschaften der HASH-Partition
So erstellen Sie eine HASH-Partitionstabelle Verwenden Sie das Feld customer_id vom Typ INT als Partitionsschlüssel Tabelle „customer_login_log“ erstellen ( `customer_id` int(10) unsigned NOT NULL COMMENT 'Anmelde-Benutzer-ID', `login_time` Zeitstempel NICHT NULL STANDARD CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP KOMMENTAR 'Benutzeranmeldezeit', `login_ip` int(10) unsigned NOT NULL COMMENT 'Login-IP', `login_type` tinyint(4) NOT NULL COMMENT 'Anmeldetyp: 0 erfolglos 1 erfolgreich' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Benutzeranmeldeprotokolltabelle' PARTITION NACH HASH(Kunden-ID) PARTITIONEN 4; Verwenden Sie das Nicht-INT-Feld login_time als Partitionsschlüssel (muss zuerst in den INT-Typ konvertiert werden) Tabelle „customer_login_log“ erstellen ( `customer_id` int(10) unsigned NOT NULL COMMENT 'Anmelde-Benutzer-ID', `login_time` Zeitstempel NICHT NULL STANDARD CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP KOMMENTAR 'Benutzeranmeldezeit', `login_ip` int(10) unsigned NOT NULL COMMENT 'Login-IP', `login_type` tinyint(4) NOT NULL COMMENT 'Anmeldetyp: 0 erfolglos 1 erfolgreich' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Benutzeranmeldeprotokolltabelle' PARTITION NACH HASH(UNIX_TIMESTAMP(Anmeldezeit)) PARTITIONEN 4; Wenn die Tabelle customer_login_log nicht partitioniert ist, wird die Datei auf der physischen Festplatte customer_login_log.frm # speichert die ursprünglichen Dateninformationen der Tabelle customer_login_log.ibd # Innodb-Datendatei Wenn Sie eine HASH-Partitionstabelle wie oben erstellen, gibt es fünf Dateien customer_login_log.frm Kunden-Anmeldeprotokoll#P#p0.ibd Kunden-Anmeldeprotokoll#P#p1.ibd Kunden-Anmeldeprotokoll#P#p2.ibd Kunden-Anmeldeprotokoll#P#p3.ibd Demo Die Verwendung ist dieselbe wie ohne Partition. Es scheint, als gäbe es nur eine Datenbank, aber tatsächlich gibt es mehrere Partitionsdateien. Wenn wir beispielsweise ein Datenelement einfügen möchten, müssen wir die Partition nicht angeben. MySQL erledigt das automatisch für uns. Abfrage Bereichspartitionierung (RANGE) RANGE-Partitionseigenschaften
So erstellen Sie eine RANGE-Partition Wenn die P3-Partition nicht definiert ist, wird ein Fehler gemeldet, wenn die eingegebene Kunden-ID größer als 29999 ist. Wenn sie definiert ist, werden alle Daten, die diesen Grenzwert überschreiten, in P3 gespeichert. Anwendbare Szenarien für die RANGE-Partitionierung
LIST-Partition Funktionen der LIST-Partition
So erstellen Sie eine LIST-Partition Wenn Sie eine Zeile mit Login-Typ 10 einfügen, wird ein Fehler gemeldet. 3. So partitionieren Sie die Anmeldeprotokolltabelle (customer_login_log) Geschäftsszenario
Partitionstyp und Partitionsschlüssel der Anmeldeprotokolltabelle
Partitionierte Benutzeranmeldeprotokolltabelle Die Daten werden in Partitionen nach Jahren gespeichert, daher wird zur Konvertierung die Funktion YEAR verwendet. Tabelle „customer_login_log“ erstellen ( `customer_id` int(10) unsigned NOT NULL COMMENT 'Anmelde-Benutzer-ID', `login_time` DATETIME NOT NULL COMMENT 'Benutzeranmeldezeit', `login_ip` int(10) unsigned NOT NULL COMMENT 'Login-IP', `login_type` tinyint(4) NOT NULL COMMENT 'Anmeldetyp: 0 erfolglos 1 erfolgreich' ) ENGINE=InnoDB PARTITION NACH BEREICH (JAHR(Anmeldezeit))( PARTITION p0 WERTE WENIGER ALS (2017), PARTITION p1 WERTE WENIGER ALS (2018), PARTITION p2 WERTE WENIGER ALS (2019) ) Einfügen und Abfragen von Daten Abfragen der Partitionsdaten in der angegebenen Tabelle SELECT Tabellenname, Partitionsname, Partitionsbeschreibung, Tabellenzeilen FROM information_schema.`PARTITIONS` WHERE Tabellenname = 'Kunden-Anmeldeprotokoll'; Fügen Sie zwei weitere 18-Jahres-Protokolle ein und speichern Sie sie in der Tabelle p2 Wie bereits erwähnt, ist es beim Erstellen einer Partitionstabelle am besten, eine MAXVALUE-Partition zu erstellen. Der Grund, warum sie hier nicht erstellt wird, ist die bequemere Datenverwaltung. Wenn wir eine MAXVALUE-Partition erstellen, können wir leicht ein Problem übersehen. Wenn wir 2019 einige Daten einfügen, werden sie automatisch in dieser MAXVALUE-Partition gespeichert, was bei der späteren Datenverwaltung unpraktisch ist. Daher wird die MAXVALUE-Partition nicht erstellt. Stattdessen fügen wir diese Partition am Ende jedes Jahres über die geplante Aufgabe hinzu. Beispielsweise müssen wir am Ende von 2018 eine Protokollpartition für 2019 in der Protokolltabelle erstellen, da sonst die Protokolle für 2019 nicht eingefügt werden können. Wir können die folgende Anweisung verwenden Hinzufügen einer Partition ALTER TABLE customer_login_log ADD PARTITION (PARTITION p3 WERTE WENIGER ALS (2020)) Partitionen hinzufügen und Daten einfügen Löschen einer Partition Wenn wir die Daten von 2016 bis 2017 löschen möchten, müssen wir, da wir die Daten bereits partitioniert haben, nur die Partition p0 mit einer Anweisung löschen. ALTER TABLE customer_login_log DROP PARTITION p0; Es kann festgestellt werden, dass die p0-Partition gelöscht und alle Protokolle im Jahr 2016 bereinigt wurden. Historische Partitionsdaten archivieren Möglicherweise besteht ein weiterer Grund zur Archivierung von Daten MySQL-Version>=5.7, das Archivieren historischer Partitionsdaten ist sehr praktisch, und es wird eine Methode zum Austauschen von Partitionen bereitgestellt Bedingungen für die Migration von Partitionsdatenarchiven:
Erstellen einer Tabelle und Austauschen von Partitionen Tabelle „arch_customer_login_log“ erstellen ( `customer_id` INT unsigned NOT NULL COMMENT 'Anmelde-Benutzer-ID', `login_time` DATETIME NOT NULL COMMENT 'Benutzeranmeldezeit', `login_ip` INT unsigned NOT NULL COMMENT 'Login-IP', `login_type` TINYINT NOT NULL COMMENT 'Anmeldetyp: 0 erfolglos 1 erfolgreich' ) ENGINE=InnoDB; ALTER TABLE customer_login_log Tauschen Sie PARTITION p1 mit Tabelle arch_customer_login_log aus; Es kann festgestellt werden, dass die Daten von 2017 in der ursprünglichen Tabelle „customer_login_log“ (die Daten in der Partition p1) in die Tabelle „arch_customer_login_log“ übertragen wurden, die Partition p1 jedoch nicht gelöscht wurde, sondern nur die Daten übertragen wurden. Daher müssen wir auch den Befehl DROP ausführen, um die Partition zu löschen und zu verhindern, dass Daten in sie eingefügt werden. Ändern Sie die Speicher-Engine der archivierten Daten in die Archiv-Engine Zum Schluss ändern wir die Speicher-Engine der archivierten Daten in die Archiv-Engine. Der Befehl lautet ALTER TABLE customer_login_log ENGINE=ARCHIV; Der Vorteil der Verwendung der Archiv-Engine besteht darin, dass sie weniger Speicherplatz beansprucht als Innodb. Allerdings kann die Archiv-Engine nur Abfragevorgänge, keine Schreibvorgänge ausführen. 4. Hauptpunkte bei der Verwendung einer Partitionstabelle
Unterschiede zwischen MyISAM- und Innodb-Indizes 1. Über automatisches Wachstum Die Auto-Increment-Spalte der MyISAM-Engine muss ein Index sein. Wenn es sich um einen zusammengesetzten Index handelt, muss die Auto-Increment-Spalte nicht die erste Spalte sein. Sie kann nach dem Sortieren der vorherigen Spalten inkrementiert werden. Die automatische Wachstumsspalte der InnoDB-Engine muss ein Index sein. Wenn es sich um einen zusammengesetzten Index handelt, muss sie auch die erste Spalte des zusammengesetzten Index sein. 2. Über den Primärschlüssel MyISAM lässt die Existenz von Tabellen ohne Indizes oder Primärschlüssel zu. MyISAM-Indizes speichern Zeilenadressen. Wenn die InnoDB-Engine keinen Primärschlüssel oder einen nicht leeren eindeutigen Index festlegt, wird automatisch ein 6-Byte-Primärschlüssel generiert (für den Benutzer unsichtbar). Innodb-Daten sind Teil des Primärindex und der zusätzliche Index speichert den Wert des Primärindex. 3. Über die Funktion count() MyISAM speichert die Gesamtzahl der Zeilen in einer Tabelle. Wenn Sie count(*) from table; auswählen, erhalten Sie den Wert direkt. Innodb speichert nicht die Gesamtzahl der Zeilen in der Tabelle. Wenn Sie select count(*) from table; verwenden, wird die gesamte Tabelle durchlaufen, was ziemlich zeitaufwändig ist. Nach dem Hinzufügen der Wefre-Bedingung behandeln MyISAM und Innodb dies jedoch auf die gleiche Weise. 4. Volltextindizierung MyISAM unterstützt Volltextindex vom Typ FULLTEXT InnoDB unterstützt keine Volltextindizierung vom Typ FULLTEXT, aber InnoDB kann das Sphinx-Plug-In verwenden, um die Volltextindizierung zu unterstützen, und die Wirkung ist besser. (Sphinx ist eine Open-Source-Software, die API-Schnittstellen in mehreren Sprachen bereitstellt und verschiedene MySQL-Abfragen optimieren kann.) 5.Aus Tabelle löschen Bei Verwendung dieses Befehls erstellt InnoDB die Tabelle nicht neu, sondern löscht die Daten nacheinander. Wenn Sie eine Tabelle mit einer großen Datenmenge auf InnoDB löschen möchten, verwenden Sie diesen Befehl am besten nicht. (Es wird empfohlen, die Tabelle abzuschneiden, der Benutzer muss jedoch die Berechtigung zum Löschen dieser Tabelle haben.) 6. Speicherort des Index MyISAM-Indizes werden separat als Tabellenname + .MYI-Datei gespeichert. Innodb-Indizes werden zusammen mit Daten im Tabellenbereich gespeichert. Zusammenfassen Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Das könnte Sie auch interessieren:
|
>>: Detaillierte Erläuterung der offiziellen Gesichtsüberprüfung des WeChat Mini-Programms
Makrotasks und Mikrotasks JavaScript ist eine Sin...
Dieser Artikel beschreibt anhand von Beispielen, ...
Inhaltsverzeichnis 1. Ressourcen-Download 2. Entp...
Vorwort: Ich habe vor langer Zeit gehört, dass My...
Gegeben sei ein Div mit folgendem Hintergrundbild...
In diesem Artikel wird das grafische Tutorial zur...
Ich habe kürzlich einige Dinge zu verknüpften Dat...
Der gemeinsam genutzte Speicher von Nginx ist ein...
Entsprechend den wichtigsten Websites und persönl...
Wer King of Glory gespielt hat, sollte mit der Wi...
Inhaltsverzeichnis 1. Was ist Bubble Sort 2. Gebe...
Bei der Verwendung einer MySQL-Datenbank treten h...
Methode 1: Befehlszeilenänderung Wir müssen nur d...
Vorwort Kürzlich stieß ich auf ein Deadlock-Probl...
Inhaltsverzeichnis Einführung Protokollklassifizi...