Wenn MySQL zig Millionen Daten abfragt, können die meisten Abfrageoptimierungsprobleme durch Indizes gelöst werden. Bei der Verarbeitung von Hunderten Millionen Daten sind Indizes jedoch nicht so benutzerfreundlich. Die Datentabelle (Protokoll) sieht folgendermaßen aus:
Da die Daten nicht vollständig verarbeitet werden müssen, haben wir nach Gesprächen mit der Nachfrageseite einen Teil der Daten nach Zeiträumen abgetastet, beispielsweise die Daten eines Monats, also etwa 350 Millionen Zeilen. 1) Wählen Sie Innodb als Tabellen-Engine. Da die Daten nach Monaten partitioniert sind, kopieren wir die Daten der monatlichen Partition separat. Die Quelltabelle ist die MyISAM-Engine. Da wir möglicherweise einige Daten filtern müssen und die am Filter beteiligten Felder keinen Index haben, ist das Hinzufügen von Indizes mit der MyISAM-Engine langsam. CREATE TABLE `tb_name` ( `ich würde_`, ..., SCHLÜSSEL `idx_1` (`create_user_`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Anwendungsprotokoll' PARTITION NACH BEREICH(bis_Tage(Logzeit_)) ( PARTITION p1231 WERTE WENIGER ALS (737425), PARTITION p0101 WERTE KLEINER ALS (737426), PARTITION p0102 WERTE KLEINER ALS (737427), PARTITION p0103 WERTE KLEINER ALS (737428), PARTITION p0104 WERTE KLEINER ALS (737429), ...... ); 3) Führen Sie täglich Aggregationen oder andere Vorgänge an der oben generierten Tabelle durch und speichern Sie die Ergebnisse in einer temporären Tabelle. Versuchen Sie, gespeicherte Prozeduren zur Datenverarbeitung zu verwenden. Da die Verarbeitung relativ komplex und zeitaufwändig ist (das Ausführen einer gespeicherten Prozedur dauert etwa 1-2 Stunden), sollten die Betriebszeit und die Parameter während des Ausführungsprozesses aufgezeichnet werden, wenn die gespeicherte Prozedur zyklisch aufgerufen wird. Trennzeichen $$ Prozedur proc_name erstellen(param varchar(50)) beginnen deklarieren Sie das Startdatum; Enddatum deklarieren; Setze Startdatum = „31.12.2018“; Enddatum festlegen = „01.02.2019“; Transaktion starten; tmp_talbe abschneiden; begehen; während Startdatum < Enddatum Setzen Sie @Partitionsname = Datumsformat (Startdatum, „%m%d“); setze @start_time = now(); – Zeichnet die Startzeit der aktuellen Partitionsoperation auf, um die Transaktion zu starten. setze @sqlstr = concat( "in tmp_talbe einfügen", "Feldnamen auswählen", "von tb_name partition(p", @partition_name,") t ", "wo Bedingungen;" ); -- wähle @sqlstr; Anweisung aus @sqlstr vorbereiten; Anweisung ausführen; Freigabe, Vorbereitungs-STMT; begehen; -- Protokollsatz einfügen @finish_time = now(); -- Endzeit der Operation in oprerate_log-Werte einfügen (Param, @partition_name, @start_time, @finish_time, timestampdiff(Sekunde, @start_time, @finish_time)); setze Startdatum = Date_Add(Startdatum, Intervall 1 Tag); Ende während; Ende $$ Trennzeichen ; 4) Sortieren und verarbeiten Sie die oben generierten Ergebnisse. Im Allgemeinen ist die Verarbeitung relativ umständlich und erzeugt viele Zwischentabellen. Für wichtige Schritte müssen auch Metadaten des Betriebsvorgangs aufgezeichnet werden, was hohe Anforderungen an die SQL-Verarbeitung stellt. Daher wird nicht empfohlen, MySQL für diese Aufgabe zu verwenden (es sei denn, dies ist unbedingt erforderlich). Wenn die Verarbeitung auf einer Big-Data-Plattform erfolgen kann, ist die Geschwindigkeit höher und die Metadatenverwaltung relativ professionell. Dies ist das Ende dieses Artikels zur Verwendung von Partitionen zur Handhabung der MySQL-Datenoptimierung auf Milliardenebene. Weitere relevante Inhalte zur MySQL-Datenoptimierung auf Milliardenebene finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
>>: Analyse der Unfallursachen durch Unicode-Signatur BOM
Inhaltsverzeichnis 1. Änderung der Ubuntu-Quelle ...
1. Schrifteigenschaften Farbe, gibt die Farbe des...
1. MySQL herunterfahren [root@localhost /]# Diens...
Das Notizblockprogramm wird mithilfe der drei wic...
Sollte dieser Artikel Fehler enthalten oder du An...
Ich möchte den Titel links und das Datum rechts a...
Heute hat mich bei der Arbeit ein Freund, den ich ...
1. Vom Vater zum Sohn Definieren Sie das props Fe...
Schwarmclusterverwaltung Einführung Docker Swarm ...
Inhaltsverzeichnis Platzhalter-Ersetzung Konsolen...
Heute ist mir ein Problem aufgefallen: Der Inhalt ...
Ich hoffe, einige Eigenschaften des Abfrageformul...
.y { background: url(//img.jbzj.com/images/o_y.pn...
Einführung Während des Front-End-Projektentwicklu...
Problem mit der Mysql-Connector-Java-Treiberversi...