Detaillierte Erklärung langsamer MySQL-Abfragen

Detaillierte Erklärung langsamer MySQL-Abfragen

Informationen zu MySQL-Vorgängen abfragen

Status anzeigen – Zeigt alle Informationen zu MySQL-Vorgängen an. Status anzeigen, z. B. „com_insert%“; – Ruft die Anzahl der MySQL-Einfügungen ab.

Status wie „com_delete%“ anzeigen; – Anzahl der Löschungen in MySQL abrufen;

Status wie „com_select%“ anzeigen; – Anzahl der MySQL-Abfragen abrufen;

Status wie „Betriebszeit“ anzeigen; -- Die Laufzeit des MySQL-Servers abrufen. Status wie „Verbindungen“ anzeigen; -- Die Anzahl der MySQL-Verbindungen abrufen.

Abfrageinformationen zu MySQL-Operationen zeigen den Status [session|global] wie … an. Wenn Sie [session|global] nicht schreiben, ist die Standardeinstellung „session“ und es wird nur die Ausführung des aktuellen Fensters abgerufen. Wenn Sie alles sehen möchten (vom MySQL-Start bis jetzt, sollten Sie „global“ verwenden)

Durch Abfragen des Lese-/Schreibverhältnisses von MySQL können Sie eine entsprechende Konfigurationsoptimierung vornehmen.

Langsame Abfrage

Wenn die Leistung von MySQL nachlässt, aktivieren Sie die langsame Abfrage, um herauszufinden, welche SQL-Anweisung die langsame Antwort verursacht, und analysieren Sie sie. Natürlich führt das Aktivieren langsamer Abfragen zu CPU-Ausfällen und einem IO-Overhead bei Protokolldatensätzen. Daher müssen wir das Protokoll langsamer Abfragen gelegentlich aktivieren, um den MySQL-Ausführungsstatus zu prüfen.

Eine langsame Abfrage kann alle SQL-Anweisungen aufzeichnen, die länger als die „long_query_time“ ausgeführt werden. Dies dient dazu, langsame SQL-Anweisungen zu finden und zu optimieren.

Variablen wie „%slow%“ anzeigen; – Ob langsame Abfragen aktiviert werden sollen;
Status wie „%slow%“ anzeigen; – Abfrage des langsamen SQL-Abfragestatus;
Variablen wie „long_query_time“ anzeigen; – Langsame Abfragezeit

Einstellung zum Aktivieren langsamer Abfragen

mysql> Variablen wie „long_query_time“ anzeigen; -- Standardmäßig betrachtet MySQL 10 Sekunden als langsame Abfrage+-----------------+-----------+
| Variablenname | Wert |
+-----------------+------------+
| lange Abfragezeit | 10.000000 |
+-----------------+------------+

mysql> set long_query_time=1; -- Ändern Sie die langsame Abfragezeit, nur gültig für die aktuelle Sitzung;
mysql> set global slow_query_log='ON';-- Langsame Abfrage aktivieren, global hinzufügen, andernfalls wird ein Fehler gemeldet;

Sie können auch die MySQL-Konfigurationsdatei my.ini [windows] / my.cnf [Linux] in der Konfigurationsdatei ändern und hinzufügen. Beachten Sie, dass es nach [mysqld] hinzugefügt werden muss.

slow_query_log = on – Protokollierung aktivieren;
slow_query_log_file = /data/f/mysql_slow_cw.log – Protokolldatei zum Aufzeichnen von Protokollen; Hinweis: Der absolute Pfad muss in das Fenster geschrieben werden, z. B. D:/wamp/bin/mysql/mysql5.5.16/data/show-slow.log 
long_query_time = 2 – die längste Abfragezeit in Sekunden;
log-queries-not-using-indexes – gibt an, dass Abfragen, die keine Indizes verwenden, protokolliert werden

Verwenden langsamer Abfragen

Beispiel 1:

mysql> wähle sleep(3);

mysql> Status wie „%slow%“ anzeigen;
+---------------------+--------+
| Variablenname | Wert |
+---------------------+--------+
| Langsame Startthreads | 0 |
| Langsame Abfragen | 1 |
+---------------------+--------+
-- Slow_queries Es gibt insgesamt eine langsame Abfrage

Beispiel 2:

Verwenden Sie gespeicherte Prozeduren, um eine große Datenbank zum Testen aufzubauen.

Datenaufbereitung

CREATE TABLE Abteilung(
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 Kommentar 'Nummer', 
dname VARCHAR(20) NOT NULL DEFAULT "" Kommentar 'Name', 
loc VARCHAR(13) NOT NULL DEFAULT "" Kommentar 'Standort'
) ENGINE=MyISAM DEFAULT CHARSET=utf8 Kommentar „Abteilungstabelle“;

Tabelle erstellen emp
(empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, 
ename VARCHAR(20) NOT NULL DEFAULT "" Kommentar 'Name', 
job VARCHAR(9) NOT NULL DEFAULT "" Kommentar 'Arbeit',
mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 Kommentar 'Übergeordnete Nummer',
hiredate DATE NOT NULL Kommentar 'Datum des Stelleneintritts',
sal DECIMAL(7,2) NOT NULL Kommentar 'Gehalt',
comm DECIMAL(7,2) NOT NULL Kommentar 'Dividende',
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 Kommentar 'Abteilungsnummer' 
)ENGINE=MyISAM DEFAULT CHARSET=utf8 Kommentar „Mitarbeitertabelle“;

Tabelle erstellen salgrade(
Note MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 Kommentar 'Note',
losal DECIMAL(17,2) NOT NULL Kommentar 'Mindestlohn',
hisal DECIMAL(17,2) NOT NULL Kommentar 'Höchstes Gehalt'
)ENGINE=MyISAM DEFAULT CHARSET=utf8 Kommentar „Gehaltsstufentabelle“;

Einfügen in Salgrade-Werte (1.700.1200);
EINFÜGEN IN Salgrade-WERTE (2,1201,1400);
EINFÜGEN IN „Salgrade“-WERTE (3,1401,2000);
EINFÜGEN IN Salgrade-WERTE (4,2001,3000);
EINFÜGEN IN Salgrade-WERTE (5,3001,9999);

Trennzeichen $
Funktion rand_num() erstellen 
gibt tinyint(6) zurück. LIEST SQL-DATEN 
beginnen 
 Deklarieren Sie return_num tinyint(6) als Standard 0;
 setze return_num = floor(1+rand()*30);
 Rückgabewert_Nummer;
Ende $

Trennzeichen $
Funktion rand_string(n INT) erstellen 
gibt varchar(255) zurück. LIEST SQL-DATEN 
beginnen 
 deklarieren Sie chars_str varchar(100) als Standard
 „abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ“;
 Deklarieren Sie return_str varchar(255) als Standard '';
 deklariere i als int default 0;
 während ich 
  setze return_str = concat(return_str,substring(chars_str,floor(1+rand()*52),1));
  setze i = i + 1;
 Ende während;
 Rückgabe return_str;
Ende $

Trennzeichen $
Prozedur insert_emp erstellen(in start int(10),in max_num int(10))
beginnen
 deklariere i als int default 0; 
 #set autocommit =0 Setzen Sie Autocommit auf 0 und schalten Sie die automatische Übermittlung aus.
 setze Autocommit = 0; 
 wiederholen
  setze i = i + 1;
  in emp-Werte einfügen ((start+i),rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());
  bis i = max_num
 Wiederholung beenden;
 begehen;
Ende $

rufen Sie insert_emp(1,4000000) auf;
SELECT * FROM `emp`, wobei ename wie '%mQspyv%' ist; – 1,163 s

# Zeit: 150530 15:30:58 -- Die Abfrage erfolgte am 30.05.2015 um 15:30:58
# User@Host: root[root] @ localhost [127.0.0.1] -- Wer ist der Abfragende und auf welchem ​​Host? # Abfragezeit: 1,134065 Sperrzeit: 0,000000 Gesendete Zeilen: 8 Untersuchte Zeilen: 4000000 
-- Query_time: die Gesamtzeit, die für die Abfrage benötigt wurde, Lock_time: die Zeit, für die die Tabelle während der Abfrage gesperrt ist, Rows_sent: die Anzahl der zurückgegebenen Zeilen, Rows_examined: das Ergebnis, das nach dem Scannen von 4 Millionen Datenzeilen erzielt wurde;
SET timestamp=1432971058; – Der Zeitstempel, wann die langsame Abfrage aufgetreten ist;
SELECT * FROM `emp`, wobei ename wie '%mQspyv%' ist;

Nachdem die langsame Abfrage aktiviert wurde, können täglich mehrere GB an langsamen Abfrageprotokollen anfallen. Zu diesem Zeitpunkt ist eine manuelle Analyse offensichtlich nicht praktikabel.

Tools zur Analyse langsamer Abfragen:

mysqldumpslow

Dieses Tool ist ein Tool zur Analyse langsamer Abfragen, das mit langsamen Abfragen geliefert wird. Normalerweise ist dieses Tool verfügbar, solange MySQL installiert ist.

Verwendung: mysqldumpslow [ OPTS... ] [ LOGS... ] – gefolgt von Parametern und der absoluten Adresse der Protokolldatei;

 -s wonach sortiert werden soll (al, at, ar, c, l, r, t), „at“ ist Standard 
        al: durchschnittliche Sperrzeit 
        ar: Durchschnittlich gesendete Zeilen
        at: durchschnittliche Abfragezeit
        c: Anzahl 
        l: Sperrzeit
        r: gesendete Zeilen
        t: Abfragezeit

 -r Sortierreihenfolge umkehren (größtes zuletzt statt zuerst)
 -t NUM zeigt nur die Top-n-Abfragen an
 -a abstrahiere nicht alle Zahlen zu N und Strings zu 'S'
 -n NUM abstrakte Zahlen mit mindestens n Ziffern innerhalb der Namen
 -g PATTERN grep: nur Anweisungen berücksichtigen, die diesen String enthalten
 -h HOSTNAME Hostname des Datenbankservers für *-slow.log Dateiname (kann ein Platzhalter sein),
        Der Standardwert ist '*', d. h. alle
 -i NAME Name der Serverinstanz (bei Verwendung des Startskripts mysql.server)
 -l Sperrzeit nicht von Gesamtzeit abziehen

Allgemeine Verwendung

mysqldumpslow -sc -t 10 /var/run/mysqld/mysqld-slow.log # Ruft die 10 langsamsten Abfragen ab mysqldumpslow -st -t 3 /var/run/mysqld/mysqld-slow.log # Ruft die 3 langsamsten Abfragen ab mysqldumpslow -st -t 10 -g "left join" /database/mysql/slow-log # Ruft die 10 langsamsten Abfragen mit Left Joins, sortiert nach Zeit ab mysqldumpslow -sr -t 10 -g 'left join' /var/run/mysqld/mysqld-slow.log # Ruft die 10 langsamsten Abfragen mit Left Joins, sortiert nach Zeit ab mysqldumpslow -sr -t 10 -g 'left join' /var/run/mysqld/mysqld-slow.log #

Hinweis: Die Analyseergebnisse mit mysqldumpslow zeigen nicht die vollständige SQL-Anweisung an, sondern nur die Struktur der SQL-Anweisung.

Wenn: SELECT * FROM sms_send WHERE service_id=10 GROUP BY content LIMIT 0, 1000;
mysqldumps langsam anzuzeigen

Anzahl: 1 Zeit=1,91 s (1 s) Sperre=0,00 s (0 s) Zeilen=1000,0 (1000), vgos_dba[vgos_dba]@[10.130.229.196]
SELECT * FROM sms_send WHERE service_id=N GROUP BY content LIMIT N, N;

pt-Abfrage-Digest

veranschaulichen

pt-query-digest ist ein Tool zum Analysieren langsamer MySQL-Abfragen. Es kann Binlog-, allgemeine Log-, Slowlog- oder MySQL-Protokolldaten analysieren, die von SHOWPROCESSLIST oder tcpdump erfasst wurden. Die Analyseergebnisse können in eine Datei ausgegeben werden. Der Analyseprozess besteht darin, zunächst die Bedingungen der Abfrageanweisung zu parametrisieren, dann die parametrisierten Abfragen zu gruppieren und zu zählen und die Ausführungszeit, Häufigkeit, Anteil usw. jeder Abfrage zu berechnen. Die Analyseergebnisse können verwendet werden, um Probleme zu identifizieren und zu optimieren.
pt-query-digest ist ein Perl-Skript, das durch einfaches Herunterladen und Erteilen von Berechtigungen ausgeführt werden kann.

Installieren

wget http://www.percona.com/get/pt-query-digest 
chmod +x pt-Query-Digest
# Beachten Sie, dass dies ein Linux-Skript ist. Sie müssen den absoluten oder relativen Pfad angeben, um es zu verwenden - oder laden Sie den gesamten Tool-Satz herunter wget percona.com/get/percona-toolkit.rpm
U/min -ivh percona-toolkit-2.2.13-1.noarch.rpm

wget percona.com/get/percona-toolkit.tar.gz
tar -zxvf percona-toolkit-2.2.13.tar.gz 
CD Percona-Toolkit-2.2.13
perl Makefile.PL
machen && machen installieren

Syntax und wichtige Optionen

pt-query-digest [OPTIONEN] [DATEIEN] [DSN]

--create-review-table Wenn der Parameter --review verwendet wird, um die Analyseergebnisse in eine Tabelle auszugeben, wird diese automatisch erstellt, falls sie nicht existiert.
--create-history-table Wenn der Parameter --history verwendet wird, um die Analyseergebnisse in eine Tabelle auszugeben, wird diese automatisch erstellt, wenn die Tabelle nicht existiert.
--filter gleicht die langsamen Eingabeabfragen ab und filtert sie gemäß der angegebenen Zeichenfolge, bevor sie analysiert werden. --limit begrenzt den Prozentsatz oder die Anzahl der Ausgabeergebnisse. Der Standardwert ist 20, was bedeutet, dass die 20 langsamsten Anweisungen ausgegeben werden. Wenn es 50 % sind, werden sie entsprechend dem Anteil an der gesamten Antwortzeit von groß nach klein sortiert, und die Ausgabe endet, wenn die Summe 50 % erreicht.
--host MySQL-Serveradresse --user MySQL-Benutzername --password MySQL-Benutzerkennwort --history Speichert die Analyseergebnisse in der Tabelle. Die Analyseergebnisse sind relativ detailliert. Wenn Sie --history das nächste Mal verwenden und dieselbe Anweisung vorhanden ist und das Zeitintervall der Abfrage von dem in der Verlaufstabelle abweicht, wird dies in der Datentabelle aufgezeichnet. Sie können die historischen Änderungen eines bestimmten Abfragetyps vergleichen, indem Sie dieselbe PRÜFSUMME abfragen.
--review speichert die Analyseergebnisse in der Tabelle. Diese Analyse parametrisiert lediglich die Abfragebedingungen, ein Datensatz für einen Abfragetyp, was relativ einfach ist. Wenn Sie --review das nächste Mal verwenden, wird die gleiche Anweisungsanalyse, falls sie bereits vorhanden ist, nicht in der Datentabelle aufgezeichnet.
--output Der Ausgabetyp der Analyseergebnisse. Die Werte können report (Standardanalysebericht), slowlog (MySQL Slow Log), json oder json-anon sein. Report wird im Allgemeinen zur leichteren Lesbarkeit verwendet.
--since Der Zeitpunkt, zu dem die Analyse gestartet werden soll. Der Wert ist eine Zeichenfolge. Es kann sich um einen angegebenen Zeitpunkt im Format „yyyy-mm-dd [hh:mm:ss]“ oder einen einfachen Zeitwert handeln: s (Sekunden), h (Stunden), m (Minuten), d (Tage). Beispielsweise bedeutet 12h, dass die Statistiken vor 12 Stunden beginnen.
--until deadline kann in Kombination mit --since langsame Abfragen über einen bestimmten Zeitraum analysieren.

Teil I: Statistische Gesamtergebnisse:

Erläuterung zum Standardanalysebericht

Gesamt: Wie viele Abfragen gibt es insgesamt? Im obigen Beispiel sind es insgesamt 266 Abfragen.
Zeitbereich: Der Zeitbereich für die Abfrageausführung.
unique: Die Anzahl eindeutiger Abfragen, d. h. die Gesamtzahl unterschiedlicher Abfragen, nachdem die Abfragebedingungen parametrisiert wurden. In diesem Beispiel ist es 4.
total: Gesamt min: Minimum max: Maximum avg: Durchschnitt
95 %: Ordnen Sie alle Werte von klein nach groß an. Die Zahl bei 95 % ist im Allgemeinen als Referenz am wertvollsten.
Median: Der Median ist die Zahl in der Mitte aller von klein nach groß angeordneten Werte.

Teil 2: Ergebnisse der Abfragegruppenstatistik:

Dieser Teil parametrisiert und gruppiert die Abfragen und analysiert dann die Ausführung jedes Abfragetyps. Die Ergebnisse werden nach der Gesamtausführungszeit vom größten zum kleinsten sortiert.
Antwort: Gesamtantwortzeit.
Zeit: Der Gesamtzeitprozentsatz dieser Abfrage in dieser Analyse.
Aufrufe: Die Anzahl der Ausführungen, d. h. wie viele Abfrageanweisungen dieses Typs in dieser Analyse vorhanden sind.
R/Call: Durchschnittliche Antwortzeit pro Ausführung.
Artikel: Abfrageobjekt

Teil 3: Detaillierte Statistiken für jede Abfrage:

Wie aus der obigen Abbildung ersichtlich, sind in der oberen Tabelle die detaillierten statistischen Ergebnisse der Abfrage Nr. 1 aufgeführt. Dabei werden die Statistiken jedes Elements aufgelistet, z. B. die Anzahl der Ausführungen, Maximum, Minimum, Durchschnitt, 95 % usw.
Datenbanken: Datenbankname
Benutzer: Die Anzahl der Ausführungen jedes Benutzers (in Prozent)
Query_time distribution: Abfragezeitverteilung. Die Länge spiegelt das Intervallverhältnis wider. In diesem Beispiel gibt es keine Abfragen zwischen 1 s und 10 s, und alle Abfragen konzentrieren sich auf 10 s.
Tabellen: An der Abfrage beteiligte Tabellen
Erläuterung: Ein Beispiel für diese Abfrage

Anwendungsbeispiele

(1) Analysieren Sie die langsame Abfragedatei direkt:

pt-query-digest slow.log > slow_report.log

(2) Analysieren Sie die Abfragen der letzten 12 Stunden:

pt-query-digest --since=12h slow.log > slow_report2.log

(3) Analysieren Sie Abfragen innerhalb eines bestimmten Zeitraums:

pt-query-digest slow.log – seit „2014-05-17 09:30:00“ – bis „2014-06-17 10:00:00“ >> slow_report3.log

(4) Analysieren Sie langsame Abfragen, die nur Select-Anweisungen enthalten

pt-query-digest --filter '$event->{fingerprint} =~ m/^select/i' slow.log> slow_report4.log

(5) Langsame Abfrage für einen bestimmten Benutzer

pt-query-digest --filter '($event->{user} || "") =~ m/^root/i' slow.log> slow_report5.log

(6) Abfrage aller langsamen Abfragen, die vollständige Tabellenscans oder vollständige Verknüpfungen beinhalten

pt-query-digest --filter '(($event->{Full_scan} || "") gleich "ja") ||(($event->{Full_join} || "") gleich "ja")' slow.log> slow_report6.log

(7) Speichern Sie die Abfrage in der Tabelle query_review der Testdatenbank. Wenn sie nicht existiert, wird sie automatisch erstellt.

pt-query-digest --user=root –password=abc123 --review h=localhost,D=test,t=query_review --create-review-table slow.log

(8) Speichern Sie die Abfrage in der Tabelle query_history

pt-query-digest --user=root –password=abc123 --review h=localhost,D=test,t=query_history --create-review-table slow.log_20140401

(9) Erfassen Sie die TCP-Protokolldaten von MySQL über tcpdump und analysieren Sie sie anschließend

tcpdump -s 65535 -x -nn -q -tttt -i beliebig -c 1000 Port 3306 > mysql.tcp.txt
pt-query-digest --type tcpdump mysql.tcp.txt> slow_report9.log

(10) Binlog analysieren

mysqlbinlog mysql-bin.000093 > mysql-bin000093.sql
pt-query-digest --type=binlog mysql-bin000093.sql > slow_report10.log

(11) Allgemeines Protokoll analysieren

pt-query-digest --type=genlog localhost.log > slow_report11.log

Oben finden Sie eine ausführliche Erklärung zu langsamen MySQL-Abfragen. Weitere Informationen zu langsamen MySQL-Abfragen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Beispielcode für ein Mysql-SQL-Überwachungsskript für langsame Abfragen
  • So finden Sie langsame MySQL-Abfragen
  • Analyse der Prinzipien der MySQL Slow Query-bezogenen Parameter
  • MySQL-Methode und Beispiel für langsame Abfragen
  • Detaillierte Erklärung, warum die langsame Abfrageprotokollzeit von MySQL 5.7 8 Stunden hinter der Systemzeit liegt
  • Methode und Optimierungsprinzip für langsame MySQL-Abfragen
  • So optimieren Sie die MySQL-Leistung durch langsame MySQL-Abfragen
  • So aktivieren Sie die Protokollfunktion für langsame Abfragen in MySQL
  • Tutorial zur Konfiguration und Verwendung des MySQL-Protokolls für langsame Abfragen
  • So aktivieren Sie das langsame Abfrageprotokoll in MySQL
  • Beispiel einer langsamen MySQL-Abfrage

<<:  jQuery implementiert einen einfachen Karusselleffekt

>>:  Detaillierte Erläuterung der Befehle zum Lesen und Schreiben von Remotedateien mit Vim im Linux-System

Artikel empfehlen

Docker-Tutorial: Container verwenden (einfaches Beispiel)

Wenn Sie mit Docker noch nicht vertraut sind, seh...

So verwenden Sie CSS-Overflow: Hidden (Überlauf ausblenden und Floats löschen)

Überlauf ausblenden Damit ist gemeint, dass Text-...

Umfassendes Verständnis des html.css-Überlaufs

Umfassendes Verständnis des html.css-Überlaufs XM...

Detaillierte Erklärung der Prinzipien des responsiven Systems von Vue

Inhaltsverzeichnis Die Grundprinzipien des respon...

Detailliertes Installationstutorial für MySQL 5.7 unter CentOS 6 und 7

Für die Entwicklung benötigen Sie immer Daten. Al...

Tutorial zur Oracle-Bereitstellung in einer Linux-Umgebung

1. Umgebung und zugehörige Software Virtuelle Mas...

So erstellen Sie eine virtuelle Maschine mit Vagrant+VirtualBox

1. Einleitung Vagrant ist ein Tool zum Erstellen ...

HTML Gewichtsverlust Optimieren Sie HTML-Tags zum Erstellen von Webseiten

HTML 4 HTML (nicht XHTML), MIME-Typ ist text/html...

Eine kurze Diskussion zur Auftragsrekonstruktion: MySQL-Sharding

Inhaltsverzeichnis 1. Ziele 2. Umweltvorbereitung...

Analyse des MySQL-Sperrmechanismus und der Verwendung

Dieser Artikel veranschaulicht anhand von Beispie...

Einstellungen für den Ubuntu-Boot-Autostart-Dienst

So erstellen Sie einen Dienst und starten ihn aut...