innodb_flush_method 値メソッド (例の説明)

innodb_flush_method 値メソッド (例の説明)

innodb_flush_methodのいくつかの典型的な値

fsync: InnoDB は fsync() システム コールを使用して、データ ファイルとログ ファイルの両方をフラッシュします。fsync はデフォルト設定です。

O_DSYNC: InnoDB は、ログ ファイルを開いてフラッシュするために O_SYNC を使用し、データ ファイルをフラッシュするために fsync() を使用します。多くの種類の Unix で問題が発生しているため、InnoDB は O_DSYNC を直接使用しません。

O_DIRECT: InnoDB は O_DIRECT (または Solaris では directio()) を使用してデータ ファイルを開き、fsync() を使用してデータ ファイルとログ ファイルの両方をフラッシュします。このオプションは、一部の GNU/Linux バージョン、FreeBSD、および Solaris で使用できます。

値の取得方法については、MySQLの公式ドキュメントではこれを推奨しています

各設定がパフォーマンスに与える影響は、ハードウェア構成とワークロードによって異なります。ベンチマーク
特定の構成に応じて、どの設定を使用するか、またはデフォルト設定を維持するかを決定します。
Innodb_data_fsyncsステータス変数を調べて、fsync()呼び出しの総数を確認します。
各設定。ワークロード内の読み取り操作と書き込み操作の組み合わせによって、設定のパフォーマンスが影響を受ける可能性があります。
たとえば、ハードウェアRAIDコントローラとバッテリバックアップ書き込みキャッシュを備えたシステムでは、O_DIRECT
InnoDBバッファプールとオペレーティングシステムのファイル間の二重バッファリングを回避するのに役立ちます。
システムキャッシュ。InnoDBデータとログファイルがSAN上に配置されている一部のシステムでは、デフォルトで
SELECT文が中心の読み込み負荷の高いワークロードでは、値またはO_DSYNCの方が高速になる可能性があります。常に
実稼働環境を反映したハードウェアとワークロードでこのパラメータをテストします。

つまり、具体的な値はハードウェア構成とワークロードによって異なるため、ストレス テストを実行して決定するのが最適です。ただし、一般的に言えば、RAID コントローラとライトバック書き込みポリシーを備えた Linux 環境では、o_direct の方が適しています。ストレージ メディアが SAN の場合は、デフォルトの fsync または osync を使用する方が適している可能性があります。

一般的に言えば、ほとんどの人は、RAID カードを下部に配置し、読み取り/書き込みポリシーを write-back に設定して、値 o_direct を使用しているようです。 sysbench を使用して oltp タイプのストレス テストを行ったところ、o_direct は fsync よりもパフォーマンスが優れており、ほとんどのシナリオに適していることがわかりました。ただし、最近、このような SQL ステートメントに遭遇し、顧客からのフィードバックが非常に遅くなりました。同じメモリでは、それによって構築されたクラウド ホストは比較的高速に実行されました。その後、この大きなパフォーマンスの違いは、主に innodb_flush_method の設定値の違いによって引き起こされていることがわかりました。

テストシナリオ1

innodb_flush_methodはデフォルト値、つまりfsync、キャッシュプールは512M、テーブルデータ量は1.2Gで、キャッシュプールの影響を除いて、安定した結果です。

mysql> '%innodb_flush_me%' のような変数を表示します。
+---------------------+-------+
| 変数名 | 値 |
+---------------------+-------+
| innodb_flush_method | |
+---------------------+-------+
セット内の 1 行 (0.00 秒)


mysql> SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main';
+--------------------------+
| SUM(結果)-SUM(収入) |
+--------------------------+
|-191010.51 |
+--------------------------+
セット1列目(1.22秒)


mysql> SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main';
+--------------------------+
| SUM(結果)-SUM(収入) |
+--------------------------+
|-191010.51 |
+--------------------------+
セット1列目(1.22秒)
mysql> explain SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main';
+----+-------------+---------+-------+---------------+-----------+--------+--------+------------------------+
| id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 |
+----+-------------+---------+-------+---------------+-----------+--------+--------+------------------------+
| 1 | SIMPLE | journal | ref | account_id | account_id | 62 | const | 161638 | インデックス条件の使用 |
+----+-------------+---------+-------+---------------+-----------+--------+--------+------------------------+
セット内の1行(0.03秒)

テストシナリオ2

innodb_flush_methodがo_directに変更され、キャッシュプールの影響がなくなり、安定化後の結果

mysql> '%innodb_flush_me%' のような変数を表示します。
+---------------------+----------+
| 変数名 | 値 |
+---------------------+----------+
| innodb_flush_method | O_DIRECT |
+---------------------+----------+
セット内の 1 行 (0.00 秒)


mysql> SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main';
+--------------------------+
| SUM(結果)-SUM(収入) |
+--------------------------+
|-191010.51 |
+--------------------------+
セット1列目(3.22秒)


mysql> SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main';
+--------------------------+
| SUM(結果)-SUM(収入) |
+--------------------------+
|-191010.51 |
+--------------------------+
セット1列目(3.02秒)


mysql> explain SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main';
+----+-------------+---------+-------+---------------+-----------+--------+--------+------------------------+
| id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 |
+----+-------------+---------+-------+---------------+-----------+--------+--------+------------------------+
| 1 | SIMPLE | journal | ref | account_id | account_id | 62 | const | 161638 | インデックス条件の使用 |
+----+-------------+---------+-------+---------------+-----------+--------+--------+------------------------+
セット内の 1 行 (0.00 秒)

結果の比較:

2 つの実行プランはまったく同じですが、パフォーマンスは大きく異なります。データベースを最初に起動したときのクエリ結果も大きく異なり、o_direct も大きく異なります (テスト結果は省略)。この場合、オペレーティング システムキャッシュの追加レイヤーによって読み取り効率が大幅に向上する理由がよくわかりません。本番環境の設定は、ストレス テストの結果と実際の効果に基づいて行う必要があり、経験値を盲目的に信頼することはできません。

改善策:

innodb_flush_method を変更せずに、複合インデックス (account_id、outcome、income) を追加してカバーリング インデックス スキャンを実行することで、この SQL ステートメントをさらに最適化でき、応答時間を大幅に短縮できます。

上記のinnodb_flush_method値メソッド(例の説明)は、エディターが皆さんと共有するすべての内容です。 皆さんの参考になれば幸いです。 また、123WORDPRESS.COMを応援していただければ幸いです。

<<:  Jenkins の紹介と Docker で Jenkins をデプロイする方法

>>:  JavaScript キャンバスはマウスの動きに合わせてボールを動かすことを実装します

推薦する

MySQL ディープ ページング (数千万のデータを素早くページ分割する方法)

目次序文場合最適化まとめ序文バックエンド開発では、一度に大量のデータがロードされ、メモリやディスク ...

mysql8.0.11 winx64 のインストールと設定方法のグラフィック チュートリアル (win10)

mysql 8.0.11 winx64のインストールチュートリアルは以下のように記録され、みんなと...

Vue3のサンドボックスの仕組みの詳しい説明

目次序文ブラウザコンパイル版ローカルプリコンパイルバージョン要約する序文vue3サンドボックスには主...

Win10 での MySQL 8.0.16 のインストールと設定のチュートリアル

1. MySQL 8.0.16を解凍する次の図に示すように、解凍後にdadaフォルダとmy.ini構...

div 要素に終了タグがないため、Web ページを開くことができません

最初は速度の問題だと思ったので、その後、すべての画像リンク リクエストをクロスサイト接続ではなくサイ...

MySQLに挿入する前にデータが存在するかどうかを確認する方法

ビジネスシナリオ: 訪問者の訪問状況を記録する必要があるが、繰り返し記録することはできない挿入する前...

QT が MYSQL データベースに接続するための詳細な手順

最初のステップは、対応するデータベースモジュール(sql)をプロジェクトファイル( .pro )に追...

よくある MySQL テーブル設計エラーの概要

目次間違い1: データの列が多すぎる誤解2: 共同クエリが多すぎる誤解3: ENUMの代わりにSET...

興味深いカウントダウン効果を実現するjs

js興味深いカウントダウンケース、参考までに、具体的な内容は次のとおりですコード: <!DO...

Linuxコマンドunzipの詳しい説明

目次1. 解凍コマンド1.1 構文1.2 オプション2. 例1. 解凍コマンドunzip コマンドは...

jsはテーブルの追加と削除の操作を動的に実装します

この記事の例では、jsでテーブルを動的に追加および削除するための具体的なコードを参考までに共有してい...

SSHを使用してDockerサーバーに接続する方法

初めて docker に触れたときは本当に戸惑いました。初心者向けのチュートリアルを長い間読みました...

ユーザーエクスペリエンスの概要

最近では、ソフトウェアやウェブサイトのいずれの作業であっても、設計時に「ユーザー エクスペリエンス」...

JavaScriptでポインターの位置を取得する方法を教えます

JavaScript でポインターの位置を取得する方法は、イベント オブジェクトの pageX と ...

MySQL InnoDB row_id 境界オーバーフロー検証方法の手順

背景クラスメートと row_id の境界問題について話し合ったので、ここで詳しく説明します。 Inn...