1. Problembeschreibung Kürzlich stieß ich auf ein Problem. Bei der Verwendung partitionierter Tabellen zum Abfragen/Laden von Daten sank die Leistung im Vergleich zu normalen Tabellen um etwa 50 %. Der Hauptengpass trat bei der CPU auf. Da es sich um den CPU-Engpass handelte, können wir 2. Stapelanalyse mit pt-pmap Um dies mit Nach dem Formatieren haben wir den Idle-Wartestapel entfernt und wie oben gezeigt eine große Anzahl davon gefunden, was auch durch die Leistung in perf top -a -g bestätigt wurde. 3. Analyse der Engpässe in dieser Spalte Wir sehen, dass hier viel ha_innobase::build_template ->Build_Template_Feld ->dict_col_get_cluster_pos Die Logik ist ungefähr wie folgt:
Hier können wir sehen, dass es tatsächlich zwei Schichten von Schleifen gibt, d. h. Schleifen innerhalb von Schleifen (Zeitkomplexität O(M×N)), und die Schleifen haben an zwei Stellen die größte Auswirkung:
Deshalb ist es hier langsam. Vorlagen werden jedoch normalerweise nicht mehrfach für eine Abfrage erstellt. Beispielsweise wird eine große Abfrage einer allgemeinen Tabelle nur erstellt, bevor die Anweisung zum ersten Mal Daten findet. Dies ist ein besonderer Punkt beim Vergleich zwischen partitionierten Tabellen und allgemeinen Tabellen. Lassen Sie es mich unten beschreiben. 4. Mehrfaches Anlegen von Vorlagen in der PartitionstabelleAngenommen, wir haben die folgende Partitionstabelle: Tabelle erstellen t( id1 int, id2 int, Primärschlüssel (id1), Schlüssel(id2) )engine=innodb Partition nach Bereich (id1)( Partition p0-Werte kleiner als (100), Partition p1 Werte kleiner als (200), Partition p2-Werte kleiner als (300)); in t-Werte (1,1) einfügen; in t-Werte (101,1) einfügen; in t-Werte (201,1) einfügen; in t-Werte (2,2) einfügen; in t-Werte (3,2) einfügen; in t-Werte (4,2) einfügen; in t-Werte einfügen (7,2); in t-Werte (8,2) einfügen; in t-Werte einfügen (9,2); in t-Werte (10,2) einfügen; Wir verwenden die Anweisung „ Auf diese Weise muss wenn (m_prebuilt->sql_stat_start) { build_template(falsch); } m_prebuilt->sql_stat_start wird nicht nur zu Beginn der Anweisung auf „true“ gesetzt, sondern auch jedes Mal, wenn die Partition wie folgt geändert wird: ha_innopart::partition_einstellen: m_prebuilt->sql_stat_start = m_sql_stat_start_parts.test(part_id); 5. Über ein spezielles Verfahren Es gibt auch einen Stapel in unserem Fehler Dieser Stapel ist eigentlich nicht vollständig, aber wähle * aus t, wobei ID2<2, sortiere nach ID2; Stapel: Dies liegt daran, dass das Feld id2 lediglich innerhalb der Partition für eine Sortierung der Daten nach Größe sorgt, in der gesamten Tabelle jedoch durcheinander kommt und eine zusätzliche Verarbeitung erfordert. 6. ProblemsimulationMit diesen Vorbereitungen können wir eine Partitionstabelle mit 300 Feldern und 25 Partitionen erstellen. Die neueste Testversion ist 8.0.26 Tabelle tpar300col erstellen( id1 int, id2 int, id3 int, id4 int, ... id299 varchar(20), id300 varchar(20), Primärschlüssel (id1), Schlüssel(id2) )engine=innodb Partition nach Bereich (id1)( Partition p0-Werte kleiner als (100), Partition p1 Werte kleiner als (200), Partition p3 Werte kleiner als (300), ... Partition p25-Werte kleiner als (2500)); in tpar300col Werte einfügen (1, 1, 1, .... fügen Sie ein Datenelement pro Partition in tpar300col values(2401,1,1 Konstruieren Sie dann eine andere Daten-ID2 ungleich 1 und erstellen Sie eine gespeicherte Prozedur: Trennzeichen // PROZEDUR ERSTELLEN test300col() beginnen Deklariere num int; setze Num = 1; während num <= 1000000 Wählen Sie * aus tpar300col, wo ID2=1; setze Num = Num+1; Ende während; Ende // implementieren: /opt/mysql/mysql3340/install/mysql8/bin/mysql -S--socket=/opt/mysql/mgr3315/data/mgr3315.sock -e'use test;call test300col();' > log.log Dann stellt perf top Folgendes fest: Dies bestätigte das Problem. VII. FazitDieses Problem hängt tatsächlich mit der Datenstreuung des Sekundärindex im Verhältnis zum Partitionsschlüssel zusammen, wir können jedoch die Daten des Sekundärindex nicht steuern und müssen den Index verwenden. Wir können nur versuchen, es auf irgendeine Weise zu vermeiden. Natürlich habe ich auch einen BUG gemeldet, und zwar wie folgt: https://bugs.mysql.com/bug.php?id=104576 Ich weiß nicht, ob es eine Möglichkeit gibt, dieses Problem zu beheben. Beispielsweise sind bei einer partitionierten Tabelle die Felder jeder Partition tatsächlich gleich. Muss ich
Dies ist das Ende dieses Artikels über einen Leistungsfehler in MySQL-Partitionstabellen. Weitere Informationen zu einem Leistungsfehler in MySQL-Partitionstabellen 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:
|
<<: Lösung zum Einfügen eines Formulars mit einer Leerzeile oben und unten
<br /> Hinweis: Alle Texte, mit Ausnahme der...
MySQL ist ein kleines relationales Open-Source-Da...
TRUNCATE-TABELLE Löscht alle Zeilen in einer Tabe...
1. Zählen Sie die Anzahl der Benutzer, deren Stan...
Vorwort Wenn Sie ein Topmenü erstellen, müssen Si...
Vorwort: Im täglichen Studium und bei der Arbeit ...
In diesem Artikelbeispiel wird der spezifische Co...
Inhaltsverzeichnis Vorwort 1. unbekannt vs. belie...
Inhaltsverzeichnis Holen Sie sich den Inhalt des ...
Da ich MySQL schon so lange verwende, glaube ich,...
Beispiel: <html> <Kopf> <style typ...
1. Mechanismus des Linux-Kernel-Treibermoduls Sta...
Inhaltsverzeichnis Funktionseinführung Funktion E...
Im folgenden Beispiel ist die Anzeige normal, wenn...
In diesem Artikelbeispiel wird der spezifische Co...