Heim > Datenbank > MySQL-Tutorial > Hauptteil

Wie optimiert man MySQL? MySQL-bezogene Optimierung

零下一度
Freigeben: 2017-04-22 16:56:59
Original
1345 Leute haben es durchsucht

1 Hardwareschichtbezogene Optimierung

1.1, CPU-bezogen

In den BIOS-Einstellungen des Servers können Sie die folgenden Konfigurationen anpassen, um die Leistung der CPU zu maximieren , oder Vermeiden Sie klassische NUMA-Probleme:

1. Wählen Sie den Performance Per Watt Optimized (DAPC)-Modus, um die CPU-Leistung zu maximieren, wenn Sie Dienste wie DB ausführen, die normalerweise erforderlich sind eine große Menge an Berechnungen.

2. Deaktivieren Sie Optionen wie C1E und C States, auch um die CPU-Effizienz zu verbessern; > 3. Speicherfrequenz (Frequenz) wählen Sie „Maximale Leistung“ (beste Leistung); 4. Aktivieren Sie im Speichereinstellungsmenü „Node Interleaving“, um NUMA-Probleme zu vermeiden 🎜> 1.2. Festplatten-E/A-bezogen

Im Folgenden sind einige Maßnahmen aufgeführt, die für Festplatten-E/A in der Reihenfolge der IOPS-Leistungsverbesserung optimiert werden können:

1. Verwenden Sie SSD- oder PCIe-SSD-Geräte, um eine mindestens hundert- oder sogar tausendfache IOPS-Verbesserung zu erzielen

2. Kaufen Sie eine Array-Karte mit CACHE und BBU-Module, die die IOPS erheblich verbessern können (bezieht sich hauptsächlich auf mechanische Festplatten, ausgenommen SSD oder PCIe-SSD). Gleichzeitig muss der Gesundheitszustand der CACHE- und BBU-Module regelmäßig überprüft werden, um sicherzustellen, dass keine Daten verloren gehen Unfall);

3 , wenn eine Array-Karte vorhanden ist, setzen Sie die Array-Schreibstrategie auf WB oder sogar FORCE WB (wenn es einen Dual-Power-Schutz gibt oder die Datensicherheitsanforderungen bestehen). nicht besonders hoch), ist die Verwendung der WT-Strategie strengstens untersagt. Und die Closed-Array-Read-Ahead-Strategie ist grundsätzlich nutzlos und von geringem Nutzen.

 4. Verwenden Sie möglichst oft RAID-10 statt RAID-5

5. Wenn Sie eine mechanische Festplatte verwenden, versuchen Sie, eine Hochgeschwindigkeitsfestplatte zu wählen, wählen Sie beispielsweise eine 15.000-RPM-Festplatte anstelle einer 7,2.000-RPM-Festplatte, die nicht ein paar Dollar wert ist 🎜>

2 Systemebenenbezogene Optimierungen


2.1. Optimierung der Dateisystemebene

Auf der Dateisystemebene können die folgenden Maßnahmen die IOPS-Leistung erheblich verbessern:

1. Verwenden Sie die beiden I/O-Scheduler „deadline/noop“. Verwenden Sie nicht cfq (es ist nicht für die Ausführung von DB-Diensten geeignet). . Wenn Sie das xfs-Dateisystem verwenden, verwenden Sie nicht ext3; ext4 ist kaum verfügbar, aber wenn das Geschäftsvolumen groß ist, müssen Sie xfs verwenden Parameter hinzugefügt: noatime, nodiratime, nobarrier-Optionen (nobarrier gilt nur für das xfs-Dateisystem);


 2.2, andere Kernel-Parameteroptimierungen
Legen Sie geeignete Werte für wichtige Kernel-Parameter fest, um die Tendenz zum Auslagern zu reduzieren und große Schwankungen im Speicher und Festplatten-I/O zu verhindern, die zu sofortigen Spitzenlasten führen:

1 . Stellen Sie vm.swappiness auf etwa 5-10 oder sogar 0 ein (achten Sie darauf, dass Sie es auf 0 für RHEL 7 oder höher setzen, es sei denn, Sie lassen zu, dass OOM-Kill auftritt), um die Wahrscheinlichkeit der Verwendung von SWAP zu verringern;

 2. Stellen Sie vm.dirty_background_ratio auf 5-10 und vm.dirty_ratio auf etwa das Doppelte ein, um sicherzustellen, dass schmutzige Daten kontinuierlich auf die Festplatte geleert werden können und sofortige E/A-Schreibvorgänge vermieden werden. ähnlich wie innodb_max_dirty_pages_pct in MySQL);


3. Setzen Sie sowohl net.ipv4.tcp_tw_recycle als auch net.ipv4.tcp_tw_reuse auf 1, um TIME_WAIT zu reduzieren und die TCP-Effizienz zu verbessern;

4. Was die beiden über das Internet übertragenen Parameter read_ahead_kb und nr_requests betrifft, so habe ich nach dem Testen festgestellt, dass sie kaum Auswirkungen auf die OLTP-Umgebung haben, in der Lesen und Schreiben hauptsächlich gemischt sind (dies sollte beim Lesen der Fall sein). und Schreiben). Sensible Szenen sind effektiver, aber vielleicht stimmt etwas mit meiner Testmethode nicht, Sie können sie nach eigenem Ermessen anpassen

3 MySQL-Layer-bezogene Optimierungen


3.1. Zur Versionsauswahl

Dazu gibt es meiner Meinung nach nichts zu sagen Die meisten Leute werden es auswählen.

Ich persönlich empfehle dringend, die Percona-Zweigversion zu wählen. Es handelt sich um eine relativ ausgereifte und hervorragende MySQL-Zweigversion, die viele Verbesserungen in Bezug auf Leistung, Zuverlässigkeit und Verwaltung vorgenommen hat. Es ist grundsätzlich vollständig mit der offiziellen ORACLE-MySQL-Version kompatibel und seine Leistung wurde um etwa 20 % oder mehr verbessert. Daher empfehle ich es zuerst und verwende es seit 2008.

Eine weitere wichtige Zweigversion ist MariaDB. Es ist eigentlich unangemessen zu sagen, dass MariaDB eine Zweigversion ist, da ihr Ziel darin besteht, ORACLE MySQL zu ersetzen. Es führt hauptsächlich viele Verbesserungen auf Quellcodeebene gegenüber der ursprünglichen MySQL Server-Ebene durch und ist außerdem eine sehr zuverlässige und hervorragende Zweigversion. Dies hat jedoch auch zu neuen Funktionen geführt, die durch GTID dargestellt werden und nicht mit der offiziellen Version kompatibel sind (ab MySQL 5.7 wird auch das dynamische Ein- und Ausschalten des GTID-Modus online unterstützt, da die überwiegende Mehrheit der Benutzer weiterhin folgen wird). die offizielle Version. Daher wird MariaDB zunächst nicht empfohlen.


 3.2. Vorschläge zur Anpassung der wichtigsten Parameteroptionen

Es wird empfohlen, die folgenden Schlüsselparameter anzupassen, um eine bessere Leistung zu erzielen (Sie können den my. cnf-Generator verwenden). generiert eine Konfigurationsdateivorlage):

1. Wenn Sie die Percona- oder MariaDB-Version wählen, wird dringend empfohlen, die Thread-Pool-Funktion zu aktivieren, die die Leistung bei hoher Parallelität verbessern kann Bedingungen. Es wird keinen großen Rückgang geben. Darüber hinaus gibt es die Funktion extra_port, die sehr praktisch ist und in kritischen Momenten Leben retten kann. Eine weitere wichtige Funktion ist die Funktion QUERY_RESPONSE_TIME, die uns auch ein intuitives Gefühl für die gesamte SQL-Antwortzeitverteilung ermöglicht

 2. Setzen Sie also default-storage-engine=InnoDB Die InnoDB-Engine wird standardmäßig nicht verwendet. Die InnoDB-Engine kann definitiv mehr als 99 % der Geschäftsszenarien erfüllen Wenn es sich um eine einzelne Instanz handelt und die meisten davon InnoDB-Engine-Tabellen sind, können Sie sie auf etwa 50 % ~ 70 % des physischen Speichers festlegen

4. Legen Sie die Werte von innodb_flush_log_at_trx_commit und sync_binlog entsprechend den tatsächlichen Anforderungen fest. Wenn keine Daten verloren gehen können, setzen Sie beide auf 1. Wenn ein geringer Datenverlust zulässig ist, können sie auf 2 bzw. 10 eingestellt werden. Und wenn es keinen Grund gibt, sich darum zu kümmern, ob die Daten verloren gehen (zum Beispiel werden sie auf dem Slave trotzdem wiederhergestellt), dann kann alles auf 0 gesetzt werden. Der Grad, in dem die Leistung der Datenbank durch diese drei Einstellungswerte beeinflusst wird, ist: hoch, mittel und niedrig, das heißt, der erste macht die Datenbank am langsamsten und der letzte ist das Gegenteil 🎜>

 5, setze innodb_file_per_table = 1, verwende unabhängigen Tabellenbereich. Ich kann mir wirklich keine Vorteile der Verwendung von gemeinsam genutztem Tabellenbereich vorstellen. Verwenden Sie nicht den Standardwert von 10 MB, sonst wird es sehr schlimm betroffen, wenn es viele gleichzeitige Transaktionen gibt;

7. Setzen Sie innodb_log_file_size=256M, setzen Sie innodb_log_files_in_group=2, was grundsätzlich 90 % oder mehr Szenarien erfüllen kann; > 8. Setzen Sie long_query_time = 1. In Version 5.5 und höher kann es auf weniger als 1 eingestellt werden. Es wird empfohlen, es auf 0,05 (50 Millisekunden) zu setzen, um diese Ausführungen aufzuzeichnen. Langsameres SQL, das für nachfolgende Analysen verwendet wird und Fehlerbehebung;

9. Passen Sie max_connection (maximale Anzahl von Verbindungen) und max_connection_error (maximale Anzahl von Fehlern) entsprechend an. Es wird empfohlen, sie auf 10 zu setzen Tausend, und die Parameter open_files_limit, innodb_open_files, table_open_cache und table_definition_cache können auf etwa das Zehnfache der Größe von max_connection eingestellt werden;

10. Ein häufiges Missverständnis besteht darin, tmp_table_size und max_heap_table_size relativ festzulegen groß, und ich habe gesehen, dass diese beiden Optionen für jede Verbindungssitzung festgelegt sind. Stellen Sie sie daher nicht zu groß ein, da sonst leicht OOM-Optionen auf Verbindungssitzungsebene auftreten, z. B. sort_buffer_size, join_buffer_size, read_rnd_buffer_size usw. müssen ebenfalls darauf achten, sie nicht zu groß einzustellen.

11. Da empfohlen wird, die MyISAM-Engine nicht mehr zu verwenden, kann key_buffer_size auf eingestellt werden ca. 32 MB, und es wird dringend empfohlen, die Abfrage-Cache-Funktion zu schließen


 3.3. Über Schema-Design-Spezifikationen und SQL-Verwendungsvorschläge

Im Folgenden sind einige allgemeine Schema-Design-Spezifikationen und SQL-Verwendungsvorschläge aufgeführt, die zur Verbesserung der Effizienz von MySQL beitragen können:

1. Alle InnoDB-Tabellen sind mit einer automatisch inkrementierenden Spalte als Primärschlüssel ausgestattet. Dies gilt für die meisten Szenarien Wenn ja, ist es besser, TokuDB zu verwenden.

2. Solange die Feldlänge den Anforderungen entspricht, wählen Sie die kleinstmögliche Länge. Versuchen Sie außerdem, den Feldattributen NOT NULL-Einschränkungen hinzuzufügen, was die Leistung bis zu einem gewissen Grad verbessern kann.

3. Versuchen Sie, den Typ TEXT/BLOB nicht zu verwenden Es wird empfohlen, die Tabelle in Untertypen aufzuteilen. Fügen Sie sie nicht mit der Haupttabelle zusammen, um eine schlechte Leseleistung bei SELECT * zu vermeiden.

4. Wählen Sie beim Lesen von Daten nicht jedes Mal * aus, um schwerwiegende zufällige Leseprobleme zu vermeiden, insbesondere beim Lesen einiger TEXT-/BLOB-Spalten >

5. Wenn Sie einen Index für eine VARCHAR(N)-Spalte erstellen, reicht es normalerweise aus, etwa 50 % (oder sogar weniger) ihrer Länge für die Erstellung eines Präfixindex zu verwenden, um mehr als 80 % zu erreichen. 6. Unter normalen Umständen ist die Leistung von Unterabfragen relativ schlecht, und das ist auch der Fall Es wird empfohlen, es auf JOIN-Schreiben umzustellen.

7. Bei Abfragen mit Mehrtabellen-Joins sollten die Typen der zugehörigen Felder so konsistent wie möglich sein und alle sollten über Indizes verfügen >
(Beachten Sie, dass sich dies auf die gefilterte Ergebnismenge bezieht, nicht unbedingt auf die kleine Datenmenge in der gesamten Tabelle) als Fahrtabelle

9. Wenn mehrere Tabellen verbunden und sortiert werden, muss das Sortierfeld in der Fahrtabelle vorhanden sein, andernfalls kann die Sortierspalte den Index nicht verwenden

10. Verwenden Sie mehr zusammengesetzte Indizes und weniger Verwenden Sie mehrere unabhängige Indizes, insbesondere wenn einige Kardinalitäten zu klein sind ( Wenn beispielsweise die Gesamtzahl der eindeutigen Werte der Spalte weniger als 255 beträgt, erstellen Sie keinen unabhängigen Index; Ergebnismenge, die Effizienz ist viel höher ;


 3.4. Weitere Vorschläge

Weitere Vorschläge zur Verwaltung und Wartung von MySQL sind:

1. Normalerweise eine einzelne Tabelle Die physische Größe überschreitet nicht 10 GB, die Anzahl der Zeilen in einer einzelnen Tabelle überschreitet nicht 100 Millionen und die durchschnittliche Zeilenlänge überschreitet nicht 8 KB. Wenn die Maschinenleistung ausreichend ist, kann MySQL diese Datenmenge vollständig verarbeiten Dieser Vorschlag besteht hauptsächlich darin, zu berücksichtigen, dass ONLINE DDL teurer ist. 2. Machen Sie sich keine allzu großen Sorgen darüber, dass der MySQLd-Prozess zu viel Speicher beansprucht Solange kein OOM-Kill auftritt und viel SWAP verwendet wird, ist es in Ordnung.

3. In der Vergangenheit bestand der Zweck darin, mehrere Instanzen auf einer einzelnen Maschine auszuführen Maximieren Sie die Nutzung der Rechenressourcen. Wenn eine einzelne Instanz bereits die meisten Rechenressourcen verbrauchen kann, ist es nicht erforderlich, mehrere Instanzen auszuführen.

 4. Verwenden Sie regelmäßig pt-duplicate-key -checker zum Überprüfen und Löschen doppelter Indizes. Verwenden Sie regelmäßig das pt-index-usage-Tool, um Indizes mit sehr geringer Nutzungshäufigkeit zu überprüfen und zu löschen.

5. Sammeln Sie regelmäßig langsame Abfrageprotokolle und verwenden Sie das pt-query-digest-Tool zur Analyse , das mit dem Anemometer-System kombiniert werden kann, führt eine langsame Abfrageverwaltung durch, um langsame Abfragen zu analysieren und anschließende Optimierungsarbeiten durchzuführen

6. Sie können pt-kill verwenden, um langfristige SQL-Anfragen zu beenden . Es gibt eine Option in der Percona-Version, mit der diese Funktion implementiert werden kann.

7. Verwenden Sie pt-online-schema-change, um die ONLINE-DDL-Anforderungen zu erfüllen 🎜>

8. Verwenden Sie regelmäßig pt-table-checksum und pt-table-sync, um die Datenunterschiede bei der MySQL-Master-Slave-Replikation zu überprüfen und zu reparieren 🎜> Am Ende geschrieben: Diese Optimierungsreferenz, groß In einigen Fällen habe ich anwendbare Szenarien vorgestellt. Wenn Ihr Anwendungsszenario von dem in diesem Artikel beschriebenen abweicht, wird empfohlen, es entsprechend der tatsächlichen Situation anzupassen, anstatt es zu kopieren es mechanisch. Fragen und Vorschläge sind willkommen, gewohnheitsmäßiger Widerstand, der nicht über das Gehirn geht, wird jedoch abgelehnt.

Das obige ist der detaillierte Inhalt vonWie optimiert man MySQL? MySQL-bezogene Optimierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage