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 ジョイントインデックス(複合インデックス)の実装

共同インデックスこの記事におけるジョイントインデックスの定義は次のとおりです (MySQL): AL...

alpineをベースにdockerfileで作成したクローラーScrapyイメージの実装

1.アルパインイメージをダウンロードする [root@DockerBrian ~]# docker ...

Docker データボリュームの一般的な操作コードの例

開発者が Dockerfile を使用してイメージをビルドする場合は、イメージをビルドするときにデー...

Linux システムで複数のバージョンの PHP を共存させるソリューション (超シンプル)

PHP7が出たので、最新バージョンのファンとしては、早速アップグレードして体験してみました。しかし...

JSを使用して画像を効果的に圧縮する方法

目次序文変換関係具体的な実装file2DataUrl(ファイル、コールバック) file2Image...

Redhat 8.0 システムのインストール方法に関するグラフィック チュートリアル (初心者には必須)

目次1. はじめに2. インストール01. 新しい仮想マシンを作成する02. システムをインストール...

Linux C++ マルチスレッド同期の非常に詳細な説明

目次1. ミューテックス1. ミューテックスの初期化2. ミューテックスロックの関連特性と分類3. ...

ノードをMySQLデータベースに接続する際に発生する問題と解決策

今日、MySQL の新しいバージョン (8.0.21) をインストールしましたが、ノード フレームワ...

Vueがsweetalert2プロンプトコンポーネントを統合する際の問題についてお話ししましょう

目次1. プロジェクト統合1. CDNインポート方法: 2. 箱の梱包を確認する3. 迅速な箱詰め4...

ヘッダーのチェックボックスをテキスト実装コードに変更するための選択テーブルを持つ要素

方法1: テーブル属性を使用する: header-cell-class-name テーブルインターフ...

MySQL ページング中にオフセットが大きすぎる場合の SQL 最適化の経験の共有

問題を見つけるコンテンツをリストで表示すると、リスト内のコンテンツの数は多いかもしれませんが、ユーザ...

オーディオマニアにアピールするオーディオビジュアルLinuxディストリビューション

私は最近、多くの音楽に特化した Linux ディストリビューションの 1 つである Audiovis...

dockerログマウントの問題を解決する

重要なのは、ローカルサーバーに書き込み権限がないことですキーはここにあります(アクセス拒否)。私は肯...

Linux DHCPサービスの詳細な説明

目次1. DHCP サービス (動的ホスト構成プロトコル) 1. 背景2. 概要3. 利点4.DHC...

MySQL解凍版のインストール手順の詳しい説明

1. 公式サイトにアクセスします: D:\mysql-5.7.21-winx64\bin をダウンロ...