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 キャンバスはマウスの動きに合わせてボールを動かすことを実装します

推薦する

Linux でファイルの権限 (所有権) を変更する

Linux と Unix はマルチユーザー オペレーティング システムであるため、ファイルの権限と所...

小さなプログラムが天井に張り付いてしまう問題を完璧に解決するためにposition:stickyを使用する方法

最近、あるプロジェクトのクライアントが、上部に 2 つのタブ メニューを配置することを要求しました。...

シングルサインオン制御を実装するためのVueの完全なコード

参考までに、Vue シングル サインオンのデモをご紹介します。詳細を知りたい方のお役に立てれば幸いで...

Mongodb の GUID 表示の問題の詳細な分析

問題を見つける最近、プログラムのストレージを Mongodb に移行したところ、Guid 型が書き込...

js 実行コンテキストとスコープの概要

目次序文文章1. JavaScriptコードの実行プロセスに関連する概念2. 実行コンテキストと実行...

MySQL 最適化のヒント: 重複削除の実装方法の分析 [数百万のデータ]

この記事では、MySQL 最適化のヒントで重複したエントリを削除する方法を例を使って説明します。ご参...

v-html レンダリング コンポーネントの問題

以前 HTML を解析したことがあるので、今日は Vue ドラッグ アンド ドロップを使用して、Ku...

WeChat アプレット uniapp は左スワイプによる削除効果を実現します (完全なコード)

WeChatアプレットuniappは左スワイプで削除効果を実現成果を達成する1. スワイプしてリス...

Kafka の Docker デプロイメントと Spring Kafka 実装

この記事は主にDockerによるKafkaのデプロイとSpring Kafkaの実装について紹介しま...

Reactの仮想DOMとdiffアルゴリズムの詳細な説明

仮想DOMの役割まず、仮想 DOM の出現によってどのような問題が解決されるのかを知る必要があります...

W3Cチュートリアル(1):W3Cを理解する

1994 年に設立された組織である W3C は、共通プロトコルの開発を促進し、それらの相互運用性を確...

Vue-Routerのインストールと使用方法の詳細な説明

目次インストールルーティングの基本構成Vue にルーターをインストールするルーターの設定Router...

CSS ワールド - コード実践: 画像の Alt 情報の表示

ただし、デフォルトの src を持つ <img> 要素を使用してスクロール読み込み効果を...

Vueは動的ルーティングの詳細を実装します

目次1. フロントエンド制御1. router.js ファイル内 (router.js にそれぞれ静...