Heim >Backend-Entwicklung >PHP-Tutorial >So optimieren Sie MySQL: Indizes, langsame Abfragen, Konfiguration
MySQL bleibt die beliebteste relationale Datenbank der Welt, ist aber auch die einfachste Datenbank, die ineffizient verwendet werden kann - viele Menschen verwenden die Standardeinstellungen ohne weitere Forschung. In diesem Artikel werden einige der zuvor eingeführten MySQL -Optimierungstechniken untersucht und sie mit den neuesten Verbesserungen kombiniert.
Kernpunkte
innodb_buffer_pool_size
, innodb_log_file_size
und innodb_flush_method
anpassen, um die Serverressourcen besser zu nutzen und die Datenbankleistung zu verbessern. pt-query-digest
, um langsame Abfragen zu überwachen und zu analysieren, um Engpässe zu erkennen und die Abfrageleistung zu optimieren. Konfigurationsoptimierung
Die erste und am meisten übersehene Leistungsverbesserung gegenüber MySQL besteht darin, die Konfiguration anzupassen. Version 5.7 (aktuelle Version) hat bessere Standardwerte als frühere Versionen, aber es können weiterhin Verbesserungen vorgenommen werden.
Wir gehen davon aus, dass Sie einen Linux-basierten Host oder eine vagrante virtuelle Maschine wie unser verbessertes Gehöft verwenden, sodass sich Ihre Konfigurationsdatei unter /etc/mysql/my.cnf
befindet. Ihr Installationsprogramm kann die Hilfskonfigurationsdatei in sie laden. Schauen Sie sich sie aus. my.cnf
/etc/mysql/mysql.conf.d/mysqld.cnf
Konfiguration bearbeiten
Wenn Sie lokal auf einem virtuellen Maschine ein Vagrant -Maschine bearbeiten, können Sie den Befehl
verwenden, um die Datei in einen freigegebenen Ordner im Hauptdateisystem zu kopieren, sie mit einem normalen Texteditor zu bearbeiten und dann wieder in seine zu kopieren Originalplatz nach Fertigstellung. Verwenden Sie ansonsten einen einfachen Texteditor wie und führen Sie den Befehl cp /etc/mysql/my.cnf /home/vagrant/Code
aus. vim
sudo vim /etc/mysql/my.cnf
befinden.
/etc/mysql/mysql.conf.d/mysqld.cnf
Manuelle Einstellung
<code>innodb_buffer_pool_size = 1G # (在此处调整值,总 RAM 的 50%-70%) innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 1 # 可以更改为 2 或 0 innodb_flush_method = O_DIRECT</code>
innodb_buffer_pool_size
- Pufferpool ist ein Speicherbereich, mit dem Daten und Indizes im Speicher zwischengespeichert werden. Es wird verwendet, um häufig auf Daten im Speicher zugegriffen zu halten, und es ist sinnvoll, diesem Teil der Anwendung den größten RAM zuzuordnen, wenn Sie einen dedizierten Server oder einen virtuellen Server ausführen, und die Datenbank ist häufig ein Engpass. Also richten wir 50-70% aller Rams zu. Eine Anleitung zur Änderung des Pufferpools finden Sie in der MySQL -Dokumentation. innodb_flush_log_at_trx_commit
Es gibt hier eine Erläuterung, die angibt, was mit der Protokolldatei passiert. Mit 1 haben wir das sicherste Setup, da die Protokolle nach jeder Transaktion auf die Festplatte gespült werden. Mit 0 oder 2 hat es weniger saure Leistung, aber eine höhere Leistung. In diesem Fall reicht der Unterschied nicht aus, um den Stabilitätsvorteil von Set 1 zu überschreiten. innodb_flush_method
- Um die Aktualisierungsarbeiten zu vervollständigen, stellen Sie sie auf O_DIRECT
ein, um eine doppelte Pufferung zu vermeiden. Dies sollte immer geschehen, es sei denn, das E/A -System funktioniert sehr schlecht. Auf den meisten verwalteten Servern wie Digitalocean -Tröpfchen haben Sie eine SSD, sodass die Leistung Ihres E/A -Systems hoch ist. Es gibt ein weiteres Tool von Percona, das uns helfen kann, die verbleibenden Probleme automatisch zu finden. Beachten Sie, dass wenn wir es ohne die oben genannten manuellen Optimierungen ausführen, nur 1 der 4 Korrekturen manuell identifiziert werden können, da die anderen 3 von den Benutzerpräferenzen und der Umgebung der Anwendung abhängen.
Um den variablen Inspektor auf Ubuntu zu installieren:
<code class="language-bash">wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb sudo dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb sudo apt-get update sudo apt-get install percona-toolkit</code>
Befolgen Sie für andere Systeme den Anweisungen.
Führen Sie dann das Toolkit mit dem folgenden Befehl aus:
<code class="language-bash">pt-variable-advisor h=localhost,u=homestead,p=secret</code>
Sie sollten die Ausgabe ähnlich wie folgt sehen:
<code># WARN delay_key_write: MyISAM index blocks are never flushed until necessary. # NOTE max_binlog_size: The max_binlog_size is smaller than the default of 1GB. # NOTE sort_buffer_size-1: The sort_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it. # NOTE innodb_data_file_path: Auto-extending InnoDB files can consume a lot of disk space that is very difficult to reclaim later. # WARN log_bin: Binary logging is disabled, so point-in-time recovery and replication are not possible.</code>
Keine davon sind wichtige Probleme und müssen nicht behoben werden. Das einzige, was wir hinzufügen können, ist eine binäre Protokollierung für Replikation und Schnappschüsse.
Hinweis: In neueren Versionen wird die Binlog -Größe standardmäßig 1G und PT bemerken.
<code>innodb_buffer_pool_size = 1G # (在此处调整值,总 RAM 的 50%-70%) innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 1 # 可以更改为 2 或 0 innodb_flush_method = O_DIRECT</code>
max_binlog_size
Setzen Sie, um die Größe des Binärprotokolls zu bestimmen. Diese Protokolle protokollieren Ihre Transaktionen und Abfragen und erstellen Checkpoints. Wenn die Transaktion größer als das Maximum ist, kann das Protokoll größer als das Maximum sein, wenn sie auf der Festplatte gespeichert werden. Wenn MySQL es noch einmal innerhalb dieser Grenze hält. log_bin
ermöglicht eine umfassende Protokollierung vollständig. Ohne sie gibt es keinen Schnappschuss oder keine Kopie. Bitte beachten Sie, dass dies viel Druck auf den Speicherplatz ausüben kann. Die Server -ID ist eine notwendige Option, wenn sie für die Binärprotokollierung aktiviert werden. Daher wissen die Protokolle, aus welchem Server sie stammen (zur Replikation), und das Format ist genau der Weg, um in das Protokoll zu schreiben. Wie Sie sehen, hat der neue MySQL angemessene Standardwerte, die die Dinge fast sofort in die Produktion gehen lassen. Natürlich ist jede App unterschiedlich und es gibt zusätzliche benutzerdefinierte Verbesserungen.
Tuner überwacht die Datenbank in längeren Intervallen (einmal pro Woche in einer Live -Anwendung ausführen) und schlägt Änderungen auf der Grundlage dessen im Protokoll vor.
Laden Sie es einfach herunter und installieren Sie es:
<code class="language-bash">wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb sudo dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb sudo apt-get update sudo apt-get install percona-toolkit</code>
Ausführen mit ./mysqltuner.pl
Erfragt den Administrator -Benutzernamen und das Passwort Ihrer Datenbank und geben Sie einen schnellen Scan aus. Zum Beispiel ist hier mein InnoDB -Abschnitt:
<code class="language-bash">pt-variable-advisor h=localhost,u=homestead,p=secret</code>
Es ist wieder wichtig zu beachten, dass dieses Tool einmal pro Woche nach dem Ausführen des Servers ausgeführt werden sollte. Nachdem Sie den Konfigurationswert geändert und den Server neu gestartet haben, sollte er eine Woche lang ausgeführt werden. Es ist am besten, einen Cron -Job zu errichten, um dies für Sie zu tun und Ihnen regelmäßig Ergebnisse zu senden.
Achten Sie nach jeder Änderung der Konfiguration sicher, dass Sie MySQL Server neu starten:
<code># WARN delay_key_write: MyISAM index blocks are never flushed until necessary. # NOTE max_binlog_size: The max_binlog_size is smaller than the default of 1GB. # NOTE sort_buffer_size-1: The sort_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it. # NOTE innodb_data_file_path: Auto-extending InnoDB files can consume a lot of disk space that is very difficult to reclaim later. # WARN log_bin: Binary logging is disabled, so point-in-time recovery and replication are not possible.</code>
Index
Konzentrieren wir uns als nächstes auf die Indexierung - die Hauptschmerzpunkte vieler Amateur -Datenbankadministratoren! Besonders diejenigen, die sofort in Orm gesprungen sind und deshalb nie wirklich die ursprüngliche SQL berührt haben.
Hinweis: Die Termschlüssel und Indizes können synonym verwendet werden.
Sie können den MySQL -Index mit dem Index im Buch vergleichen, mit dem Sie leicht die richtige Seite finden können, die das von Ihnen gesuchte Thema enthält. Ohne einen Index müssen Sie das gesamte Buch lesen, um nach Seiten zu suchen, die das Thema enthalten.
Wie Sie sich vorstellen können, ist die Suche nach Index viel schneller, als jede Seite durchqueren zu müssen. Das Hinzufügen von Indizes zu einer Datenbank kann daher ausgewählte Abfragen beschleunigen. Auch Indizes müssen jedoch auch erstellt und gespeichert werden. Daher werden die Abfragen von Aktualisierungen und Einfügen langsamer sein und mehr Speicherplatz einnehmen. Wenn Sie die Tabelle korrekt indexieren, bemerken Sie im Allgemeinen die Unterschiede in Aktualisierungen und Einfügen, sodass Sie empfohlen werden, Indizes an der richtigen Stelle hinzuzufügen.
Tabellen, die nur wenige Zeilen enthalten, profitieren nicht von der Indexierung. Wie Sie sich vorstellen können, ist die Suche nach 5 Seiten nicht langsamer, als zuerst zum Index zu gehen, Seitennummern zu erhalten und dann eine bestimmte Seite zu öffnen.
Wie können wir herausfinden, welche Indizes hinzugefügt werden sollen und welche Arten von Indizes existieren?
Der Primärschlüsselindex ist der Datenindex und die Standardmethode, um Daten zu adressieren. Für Benutzerkonten kann dies eine Benutzer -ID oder ein Benutzername oder sogar eine primäre E -Mail sein. Der Primärschlüsselindex ist eindeutig. Der einzige Index ist ein Index, der nicht in einer Reihe von Daten wiederholt werden kann.
Wenn der Benutzer beispielsweise einen bestimmten Benutzernamen auswählt, sollte niemand in der Lage sein, ihn zu verwenden. Durch das Hinzufügen eines "eindeutigen" Index in die Spalte Benutzername wird dieses Problem gelöst. Wenn jemand anderes versucht, eine Zeile mit einem vorhandenen Benutzernamen einzufügen, meldet MySQL einen Fehler.
<code>innodb_buffer_pool_size = 1G # (在此处调整值,总 RAM 的 50%-70%) innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 1 # 可以更改为 2 或 0 innodb_flush_method = O_DIRECT</code>
Primärschlüssel/Indizes werden normalerweise bei der Erstellung von Tabellen definiert, und der einzige Index wird durch Ändern der Tabelle definiert.
sowohl primäre als auch einzigartige Schlüssel können auf einer oder mehreren Spalten erstellt werden. Wenn Sie beispielsweise sicherstellen möchten, dass es nur einen Benutzernamen pro Land definiert, können Sie in beiden Spalten einen eindeutigen Index erstellen, wie folgt:
<code class="language-bash">wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb sudo dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb sudo apt-get update sudo apt-get install percona-toolkit</code>
Der eindeutige Index wird den Spalten hinzugefügt, auf die Sie häufig zugreifen. Wenn Sie also häufig ein Benutzerkonto anfordern und in der Datenbank viele Benutzerkonten enthalten, ist dies ein guter Anwendungsfall.
Allgemeiner Index vereinfacht die Suche. Sie sind nützlich, wenn Sie Daten für eine bestimmte Spalte oder Kombination von Spalten schnell finden müssen, diese Daten müssen jedoch nicht eindeutig sein.
<code class="language-bash">pt-variable-advisor h=localhost,u=homestead,p=secret</code>
Die oben genannten Operationen beschleunigen die Suche nach Benutzernamen nach Land.
Indizes verbessern auch die Sortier- und Gruppierungsgeschwindigkeiten.
Volltextindex wird für die Volltext-Suche verwendet. Nur die InnoDB- und MyISAM-Speichermotoren unterstützen die Volltextindexierung und nur die Spalten von CHAR-, Varchar- und Textspalten werden unterstützt.
Diese Indizes sind sehr nützlich für alle Textsuche, die Sie möglicherweise ausführen müssen. Die Volltextindizierung ist gut darin, Wörter im Textkörper zu finden. Wenn Sie in der App häufig nach Posts, Kommentaren, Beschreibungen, Kommentaren usw. suchen, verwenden Sie diese Indizes für diese Inhalte.
ist kein besonderer Typ, sondern eine Änderung. Ab Version 8.0 unterstützt MySQL die absteigende Indexierung, was bedeutet, dass Indizes in absteigender Reihenfolge gespeichert werden können. Dies ist praktisch, wenn Sie große Tabellen oder Prioritätseinträge haben, die häufig zuerst die letzten hinzugefügten Daten abrufen müssen. Es kann immer in absteigender Reihenfolge sortiert werden, aber dies führt zu einer kleinen Leistungsstrafe. Dies beschleunigt weiter.
<code># WARN delay_key_write: MyISAM index blocks are never flushed until necessary. # NOTE max_binlog_size: The max_binlog_size is smaller than the default of 1GB. # NOTE sort_buffer_size-1: The sort_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it. # NOTE innodb_data_file_path: Auto-extending InnoDB files can consume a lot of disk space that is very difficult to reclaim later. # WARN log_bin: Binary logging is disabled, so point-in-time recovery and replication are not possible.</code>
Erwägen Sie, Desc auf Indizes anzuwenden, wenn die in der Datenbank geschriebenen Verarbeitungsprotokolle, Beiträge und Kommentare in Back-to-Front-Reihenfolge und ähnlichen Inhalten geladen werden.
Das Erklärungswerkzeug ist bei Abfragen zur Optimierung von Optimierungen von unschätzbarem Wert. Hinzufügen von Erklärungen, bevor eine einfache Abfrage sie auf sehr tiefgreifende Weise behandelt, analysiert den verwendeten Index und zeigt das Verhältnis von Hits und Fehlern an. Sie werden feststellen, wie viele Zeilen es verarbeiten muss, um das Ergebnis zu erzielen, nach dem Sie suchen.
<code>max_binlog_size = 1G log_bin = /var/log/mysql/mysql-bin.log server-id=master-01 binlog-format = 'ROW'</code>
Sie können es mit Extended weiter erweitern:
<code class="language-bash">wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl chmod +x mysqltuner.pl</code>
Sehen Sie, wie Sie es verwenden und die Entdeckung anwenden, indem Sie diesen hervorragenden detaillierten Artikel lesen.
zuvor installiertes Percona-Toolkit bietet außerdem ein Tool zum Erkennen doppelter Indizes, das bei Verwendung eines CMS von Drittanbietern zur Verfügung steht oder nur überprüft wird, ob mehr Indizes unerwartet als erforderlich hinzugefügt werden. Zum Beispiel hat die in der Tabelle wp_posts
installierte Standardwordpress einen doppelten Index:
<code>innodb_buffer_pool_size = 1G # (在此处调整值,总 RAM 的 50%-70%) innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 1 # 可以更改为 2 或 0 innodb_flush_method = O_DIRECT</code>
Wie in der letzten Zeile gezeigt, enthält es auch Vorschläge zum Entfernen von doppelten Indizes.
Percona kann auch nicht verwendete Indizes erkennen. Wenn Sie langsame Abfragen protokollieren (siehe Abschnitt Engpassecks unten), können Sie das Tool ausführen und prüft, ob die Abfragen für diese Datensätze Indizes in den Tabellen verwenden, die sich auf die Abfragen beziehen.
<code class="language-bash">wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb sudo dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb sudo apt-get update sudo apt-get install percona-toolkit</code>
Hier finden Sie eine detaillierte Verwendung dieses Tools.
Engpass
In diesem Abschnitt wird erläutert, wie Engpässe in der Datenbank erfasst und überwacht werden.
<code class="language-bash">pt-variable-advisor h=localhost,u=homestead,p=secret</code>
Das obige sollte der Konfiguration hinzugefügt werden. Es überwacht Abfragen, die eine Ausführungszeit von mehr als 1 Sekunde haben, und diejenigen, die den Index nicht verwendet haben.
Sobald dieses Protokoll einige Daten enthält, können Sie das oben genannte pt-index-usage
-Tool oder pt-query-digest
Tool zur Analyse seiner Indexverbrauch verwenden, wodurch die folgenden Ergebnisse erzielt werden:
<code># WARN delay_key_write: MyISAM index blocks are never flushed until necessary. # NOTE max_binlog_size: The max_binlog_size is smaller than the default of 1GB. # NOTE sort_buffer_size-1: The sort_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it. # NOTE innodb_data_file_path: Auto-extending InnoDB files can consume a lot of disk space that is very difficult to reclaim later. # WARN log_bin: Binary logging is disabled, so point-in-time recovery and replication are not possible.</code>
Wenn Sie diese Protokolle lieber manuell analysieren, können Sie dies auch tun - aber zuerst müssen Sie die Protokolle in ein "analysierter" Format exportieren. Dies kann durch:
erfolgen<code>max_binlog_size = 1G log_bin = /var/log/mysql/mysql-bin.log server-id=master-01 binlog-format = 'ROW'</code>
Andere Parameter können die Daten weiter filtern und sicherstellen, dass nur wichtige Inhalte exportiert werden. Zum Beispiel: Die Top 10 Abfragen sortiert nach durchschnittlicher Ausführungszeit.
<code class="language-bash">wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl chmod +x mysqltuner.pl</code>
Siehe Dokumentation für andere Parameter.
Schlussfolgerung
In diesem umfassenden Artikel von MySQL Optimization untersuchen wir verschiedene Möglichkeiten, MySQL schneller zu machen.
Wir haben die Konfigurationsoptimierung behandelt, den Index abgeschlossen und einige Engpässe beseitigt. Dies ist jedoch größtenteils theoretisch-für praktische Anwendungsfälle, um diese Technologien in realen Anwendungen anzuwenden, achten Sie bitte auf unser bevorstehendes Leistungssteigerungsprojekt!
Haben wir Techniken und Tricks verpasst? Bitte sagen Sie es uns!
Mysql Indexierung und langsame Abfrageoptimierung FAQ (FAQ)
MySQL -Indizes sind für die Abfrageoptimierung von entscheidender Bedeutung, da sie das Abrufen von Daten erheblich beschleunigen können. Sie funktionieren ähnlich wie die Indizes im Buch, sodass die Datenbank Daten finden und abgerufen werden kann, ohne jede Zeile in der Tabelle zu scannen. Dies kann zu einer schnelleren Ausführung von Abfragen führen, insbesondere in großen Datenbanken. Es ist jedoch wichtig zu beachten, dass die Leserdrehzahl zwar die Leserdrehzahl erhöhen, die Schreibgeschwindigkeiten möglicherweise verlangsamen, da der Index beim Einfügen oder Aktualisieren von Daten aktualisiert werden muss.
MySQL bietet ein nützliches Tool namens Slow Query Log. Dieses Tool erfasst Informationen zu allen SQL -Abfragen, die mehr als die angegebene Zeit ausgeführt wurden. Sie können es in der MySQL -Konfigurationsdatei aktivieren und long_query_time
auf die Anzahl der Sekunden einstellen, die die Abfrage vornehmen sollte, bevor sie als langsame Abfrage angesehen wird.
MySQL unterstützt mehrere Arten von Indizes, einschließlich B-Tree, Hash, R-Tree und Volltextindex. Der B-Tree ist der Standardindex und für verschiedene Abfragen geeignet. Hash-Indizes werden für gleiche Vergleiche verwendet und sind für solche Abfragen schneller als B-Tree. Der R-Tree-Index wird für räumliche Datentypen verwendet, und der Volltextindex wird für die Volltext-Suche verwendet.
MySQL -Konfigurationsoptimierung beinhaltet das Tuning verschiedener Servervariablen für die Leistung. Dies beinhaltet das Einstellen der Größe der Pufferpool, die Größe der Protokolldatei, die Größe des Abfrage -Cache usw. Es ist wichtig, die Leistung des Servers regelmäßig zu überwachen und diese Variablen nach Bedarf anzupassen.
Für die MySQL -Abfrage und die Indexoptimierung stehen mehrere Tools zur Verfügung. Diese Tools umfassen die integrierten Erklärungsanweisungen von MySQL, die Informationen darüber enthalten, wie MySQL Abfragen ausführt, sowie Tools von Drittanbietern wie Percona Toolkit und MySQL Workbench.
Die Erklärungserklärung in MySQL enthält Informationen darüber, wie MySQL Abfragen ausführt. Dies umfasst Informationen zu den auf Tabellen zugegriffenen Tabellen, der Reihenfolge, in der die Tabellen zugegriffen werden, der spezifische verwendete Index und die Schätzung der Anzahl der gelesenen Zeilen. Diese Informationen können dazu beitragen, potenzielle Leistungsprobleme zu identifizieren und die Indexoptimierung zu leiten.
Obwohl die Indizes die Lesevorgänge durch Beschleunigung des Datenabs erheblich verbessern, kann dies die Schreibvorgänge verlangsamen. Dies liegt daran, dass jedes Mal, wenn Daten eingefügt oder aktualisiert werden, der entsprechende Index aktualisiert werden muss. Bei der Erstellung eines Index ist es daher wichtig, ein Gleichgewicht zwischen Lese- und Schreibvorgängen zu erreichen.
Indizes können die Leistung von Join -Operationen in MySQL erheblich verbessern. Durch das Erstellen eines Index für die in der Verknüpfungsbedingung verwendeten Spalten kann MySQL in der angeschlossenen Tabelle schnell übereinstimmende Zeilen finden. Dies verringert die Notwendigkeit eines Volltext-Scans und führt zu einer schnelleren Abfrageausführung.
Der Abfrage -Cache in MySQL speichert die Ergebnisse der Auswahlabfrage sowie der Abfrage selbst. Wenn die gleiche Abfrage empfangen wird, kann MySQL die Ergebnisse aus dem Cache abrufen, anstatt die Abfrage erneut auszuführen. Dies kann die Leistung erheblich verbessern, insbesondere bei komplexen Abfragen oder häufig ausgeführten Abfragen.
MySQL bietet mehrere Tools zur Überwachung der Serverleistung. Diese Tools umfassen Leistungsmuster (die detaillierte Leistungsmetriken bereitstellen) und Informationsmuster (Bereitstellung von Informationen zu Datenbankmetadaten). Darüber hinaus kann der Befehl show Status verwendet werden, um Informationen über den laufenden Status des Servers zu erhalten.
Das obige ist der detaillierte Inhalt vonSo optimieren Sie MySQL: Indizes, langsame Abfragen, Konfiguration. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!