innodb_flush_method-Wertmethode (Beispielerklärung)

innodb_flush_method-Wertmethode (Beispielerklärung)

Mehrere typische Werte von innodb_flush_method

fsync: InnoDB verwendet den Systemaufruf fsync(), um sowohl die Daten- als auch die Protokolldateien zu leeren. fsync ist die Standardeinstellung.

O_DSYNC: InnoDB verwendet O_SYNC zum Öffnen und Leeren der Protokolldateien und fsync() zum Leeren der Datendateien. InnoDB verwendet O_DSYNC nicht direkt, da es damit bei vielen Unix-Varianten Probleme gab.

O_DIRECT: InnoDB verwendet O_DIRECT (oder directio() unter Solaris), um die Datendateien zu öffnen, und verwendet fsync(), um sowohl die Daten- als auch die Protokolldateien zu leeren. Diese Option ist unter einigen GNU/Linux-Versionen, FreeBSD und Solaris verfügbar.

Wie man den Wert erhält, wird im offiziellen MySQL-Dokument empfohlen

Wie sich jede Einstellung auf die Leistung auswirkt, hängt von der Hardwarekonfiguration und der Arbeitslast ab. Benchmark
Ihre konkrete Konfiguration, um zu entscheiden, welche Einstellung verwendet werden soll oder ob die Standardeinstellung beibehalten werden soll.
Untersuchen Sie die Statusvariable Innodb_data_fsyncs, um die Gesamtzahl der fsync()-Aufrufe für
jede Einstellung. Die Mischung aus Lese- und Schreibvorgängen in Ihrer Arbeitslast kann sich auf die Leistung einer Einstellung auswirken.
Beispielsweise auf einem System mit einem Hardware-RAID-Controller und batteriegepuffertem Schreibcache, O_DIRECT
kann helfen, doppeltes Puffern zwischen dem InnoDB-Pufferpool und der Datei des Betriebssystems zu vermeiden
Systemcache. Auf einigen Systemen, auf denen sich InnoDB-Daten und -Protokolldateien auf einem SAN befinden, ist der Standard
value oder O_DSYNC könnte bei einer leseintensiven Arbeitslast mit überwiegend SELECT-Anweisungen schneller sein. Immer
Testen Sie diesen Parameter mit Hardware und Arbeitslast, die Ihre Produktionsumgebung widerspiegeln

Mit anderen Worten: Der konkrete Wert hängt von der Hardwarekonfiguration und der Arbeitslast ab und lässt sich am besten durch einen Stresstest bestimmen. Im Allgemeinen ist o_direct jedoch in einer Linux-Umgebung mit einem RAID-Controller und einer Write-Back-Schreibrichtlinie die bessere Wahl. Handelt es sich bei dem Speichermedium um SAN, ist die Verwendung der Standardeinstellungen fsync oder osync möglicherweise besser.

Im Allgemeinen scheinen die meisten Leute den Wert „o_direct“ mit einer RAID-Karte unten und der Lese-/Schreibrichtlinie auf „Writeback“ eingestellt zu verwenden. Als ich Sysbench zum Stresstest des OLTP-Typs verwendete, stellte ich fest, dass o_direct tatsächlich eine bessere Leistung als fsync aufweist und für die meisten Szenarien geeignet zu sein scheint. Ich bin jedoch kürzlich auf eine solche SQL-Anweisung gestoßen und das Kundenfeedback war sehr langsam. Bei gleichem Speicher wurde der damit erstellte Cloud-Host relativ schneller ausgeführt. Später stellte ich fest, dass der enorme Leistungsunterschied hauptsächlich durch die unterschiedlichen Einstellungswerte von innodb_flush_method verursacht wurde.

Testszenario 1

innodb_flush_method ist der Standardwert, d. h. fsync, der Cache-Pool ist 512 M, das Tabellendatenvolumen beträgt 1,2 G, ohne den Einfluss des Cache-Pools ist das stabile Ergebnis

mysql> Variablen wie „%innodb_flush_me%“ anzeigen;
+---------------------+--------+
| Variablenname | Wert |
+---------------------+--------+
| innodb_flush_method | |
+---------------------+--------+
1 Zeile im Satz (0,00 Sek.)


mysql> SELECT sql_no_cache SUM(Ergebnis)-SUM(Einkommen) FROM Journal, wobei account_id = "1c6ab4e7-main";
+--------------------------+
| SUMME(Ergebnis)-SUMME(Einkommen) |
+--------------------------+
|-191010.51 |
+--------------------------+
1 Reihe im Satz (1,22 Sek.)


mysql> SELECT sql_no_cache SUM(Ergebnis)-SUM(Einkommen) FROM Journal, wobei account_id = "1c6ab4e7-main";
+--------------------------+
| SUMME(Ergebnis)-SUMME(Einkommen) |
+--------------------------+
|-191010.51 |
+--------------------------+
1 Reihe im Satz (1,22 Sek.)
mysql> erklären SELECT sql_no_cache SUM(Ergebnis)-SUM(Einkommen) FROM Journal, wobei account_id = '1c6ab4e7-main';
+----+----------+---------+------+---------------+------------+---------+---------+---------+---------+--------+-----------------------+
| ID | Auswahltyp | Tabelle | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | Extra |
+----+----------+---------+------+---------------+------------+---------+---------+---------+---------+--------+-----------------------+
| 1 | SIMPLE | Journal | Ref | Account-ID | Account-ID | 62 | const | 161638 | Indexbedingung wird verwendet |
+----+----------+---------+------+---------------+------------+---------+---------+---------+---------+--------+-----------------------+
1 Zeile im Satz (0,03 Sek.)

Testszenario 2

innodb_flush_method wird in o_direct geändert, wodurch der Einfluss des Cache-Pools und das Ergebnis nach der Stabilisierung eliminiert werden

mysql> Variablen wie „%innodb_flush_me%“ anzeigen;
+---------------------+----------+
| Variablenname | Wert |
+---------------------+----------+
| innodb_flush_method | O_DIRECT |
+---------------------+----------+
1 Zeile im Satz (0,00 Sek.)


mysql> SELECT sql_no_cache SUM(Ergebnis)-SUM(Einkommen) FROM Journal, wobei account_id = "1c6ab4e7-main";
+--------------------------+
| SUMME(Ergebnis)-SUMME(Einkommen) |
+--------------------------+
|-191010.51 |
+--------------------------+
1 Reihe im Satz (3,22 Sek.)


mysql> SELECT sql_no_cache SUM(Ergebnis)-SUM(Einkommen) FROM Journal, wobei account_id = "1c6ab4e7-main";
+--------------------------+
| SUMME(Ergebnis)-SUMME(Einkommen) |
+--------------------------+
|-191010.51 |
+--------------------------+
1 Zeile im Satz (3,02 Sek.)


mysql> erklären SELECT sql_no_cache SUM(Ergebnis)-SUM(Einkommen) FROM Journal, wobei account_id = '1c6ab4e7-main';
+----+----------+---------+------+---------------+------------+---------+---------+---------+---------+--------+-----------------------+
| ID | Auswahltyp | Tabelle | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | Extra |
+----+----------+---------+------+---------------+------------+---------+---------+---------+---------+--------+-----------------------+
| 1 | SIMPLE | Journal | Ref | Account-ID | Account-ID | 62 | const | 161638 | Indexbedingung wird verwendet |
+----+----------+---------+------+---------------+------------+---------+---------+---------+---------+--------+-----------------------+
1 Zeile im Satz (0,00 Sek.)

Vergleich der Ergebnisse:

Die Ausführungspläne der beiden sind genau gleich, aber die Leistung ist sehr unterschiedlich. Die Abfrageergebnisse beim ersten Start der Datenbank sind ebenfalls sehr unterschiedlich, und o_direct ist auch sehr unterschiedlich ( Testergebnisse ausgelassen). Ich verstehe nicht ganz, warum in diesem Fall die Leseleistung aufgrund der zusätzlichen Schicht des Betriebssystem- Cache viel höher ist. Die Einstellungen der Produktionsumgebung müssen auf den Ergebnissen des Stresstests und den tatsächlichen Auswirkungen basieren, und Sie können den Erfahrungswerten nicht blind vertrauen.

Verbesserungsmaßnahmen:

Ohne innodb_flush_method zu ändern, kann diese SQL-Anweisung durch Hinzufügen eines zusammengesetzten Indexes (account_id, outcome, income) weiter optimiert werden, um einen umfassenden Indexscan durchzuführen, der die Antwortzeit erheblich verkürzen kann.

Die obige innodb_flush_method-Wertmethode (Beispielerklärung) ist der gesamte Inhalt, den der Editor mit Ihnen teilt. Ich hoffe, sie kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen.

<<:  Einführung in Jenkins und wie man Jenkins mit Docker bereitstellt

>>:  JavaScript Canvas implementiert die Bewegung des Balls entlang der Maus

Artikel empfehlen

Detaillierte Erklärung zum Upgrade von Softwarepaketversionen unter Linux

Im Linux-Umfeld möchten Sie prüfen, ob eine besti...

Detaillierte Einführung in das MySQL-Installationstutorial unter Windows

Inhaltsverzeichnis 1. Einige Konzepte, die Sie vo...

Docker verwendet den Prune-Befehl, um das Nicht-Image zu bereinigen

Inhaltsverzeichnis Die Entstehung und Verwirrung ...

Die Hauptidee zum dynamischen Festlegen von Routing-Berechtigungen in Vue

Ich habe zuvor einige dynamische Routing-Einstell...

Webdesign-Tutorial (3): Designschritte und Denkweise

<br />Vorheriges Tutorial: Webdesign-Tutoria...

Verwenden Sie PSSH zur Stapelverwaltung von Linux-Servern

pssh ist eine in Python implementierte Open-Sourc...

TypeScript-Lernhinweise: Typeingrenzung

Inhaltsverzeichnis Vorwort Typinferenz Einengung ...

Tutorial zur Installation von MySQL8 auf Centos7

Neue Funktionen in MySQL 8: Meine persönliche Mei...

Detaillierte Erklärung des Vue2 Cube-UI-Zeitwählers

Inhaltsverzeichnis Vorwort 1. Anspruch und Wirkun...

So richten Sie einen URL-Link im Nginx-Server ein

Websites mit einer Architektur wie LNMP werden im...

MySQL-Datenbanktabelle und Datenbankpartitionierungsstrategie

Lassen Sie uns zunächst darüber sprechen, warum w...