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

So verwenden Sie benutzerdefinierte CSS-Variablen in Vue

Inhaltsverzeichnis Die benutzerdefinierte CSS-Var...

So legen Sie das Breitenattribut auf den Stil des Span-Tags fest

Wenn Sie das Breitenattribut direkt auf den Stil d...

Beispielcode zur Implementierung einer Pivot-Tabelle in MySQL/MariaDB

Im vorherigen Artikel wurden mehrere Methoden zur...

Einführung in die allgemeine API-Verwendung von Vue3

Inhaltsverzeichnis Veränderungen im Lebenszyklus ...

...

JavaScript imitiert Xiaomi-Karusselleffekt

Dieser Artikel ist eine selbstgeschriebene Nachah...

Welche Bilddateiformate gibt es und wie wählt man sie aus?

1. Welche drei Formate? Dies sind: gif, jpg und pn...

Lösen Sie das Problem des Docker-Pull-Image-Fehlers

beschreiben: Installieren Sie die VM unter Window...

Die letzten zwei Jahre mit User Experience

<br />Es ist nicht länger als zwei Jahre her...

So verwenden Sie LibreOffice zum Konvertieren von Dokumentformaten unter CentOS

Die Projektanforderungen erfordern eine gewisse V...

Detaillierte Analyse des Unterschieds zwischen Ref und Reactive in Vue3.0

Inhaltsverzeichnis Ref und Reaktiv Referenz Reakt...