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
Inhaltsverzeichnis 1. Betrieb der Datenbank 1.1 E...
Vorwort Ich glaube, dass jeder in seiner tägliche...
Normale MySQL-Sortierung, benutzerdefinierte Sort...
Standardmäßig werden Breite und Höhe der Kopfzeil...
Da die gesamte Anwendung unter CentOS bereitgeste...
Als häufig verwendete Datenbank erfordert MySQL v...
Häufig verwendete Befehle für Linux-Partitionen: ...
Analysieren Sie den Ausführungsprozess. Bewegen S...
1. Was ist Scaffolding? 1. Vue-CLI Vue CLI ist ei...
Vorteile von Prepare Der Grund, warum Prepare SQL...
Die Browserkompatibilität ist der wichtigste Teil...
Die Reihenfolge, in der der Browser HTML lädt und ...
Vorwort Für Datei- oder Verzeichnisberechtigungen...
In diesem Artikel wird der spezifische JavaScript...
Zu lösendes Problem Hauptsächlich für die ebenenü...