web-dev-qa-db-ja.com

MySQL「キー効率」とは

MySQL Workbenchは、サーバーの状態に関連して「Key Efficiency」という値を報告します。これは何を意味し、その意味は何ですか?

alt text

MySQL.com から、「Key Efficiency」は次のとおりです。

...実際のkey_read_requestsになったkey_readsの数の表示。

さて、それはどういう意味ですか。サーバーをどのように調整するかについて、何がわかりますか?

54
tylerl

「キー効率」は、MySQLのメモリ内に保持されているインデックスキャッシュからどれだけの値を取得しているかを示します。キー効率が高い場合、ほとんどの場合、MySQLはメモリスペース内からキールックアップを実行しています。これは、ディスクから関連するインデックスブロックを取得するよりもはるかに高速です。

主要な効率を改善する方法は、より多くのシステムメモリをMySQLのインデックスキャッシュ専用にすることです。これを行う方法は、使用するストレージエンジンによって異なります。 MyISAMの場合、key-buffer-sizeの値を増やします。 InnoDBの場合、innodb-buffer-pool-sizeの値を増やします。

ただし、Michael Eakinsが指摘しているように、オペレーティングシステムは最近アクセスしたディスクブロックのキャッシュも保持しています。オペレーティングシステムが使用できるメモリが多いほど、キャッシュできるディスクブロックが多くなります。さらに、ディスクドライブ自体(および場合によってはディスクコントローラー)にもキャッシュがあります。これもまた、ディスクからのデータの取得を高速化できます。階層は次のようなものです。

  1. 最速-MySQLのインデックスキャッシュ内からインデックスデータを取得します。コストは、いくつかのメモリ操作です。
  2. oSファイルシステムキャッシュに保持されているインデックスデータを取得します。コストは、システムコール(読み取り用)と一部のメモリ操作です。
  3. ディスクシステムキャッシュ(コントローラーとドライブ)に保持されているインデックスデータを取得します。コストは、システムコール(読み取り)、ディスクデバイスとの通信、および一部のメモリ操作です。
  4. 最も遅い-ディスク表面からインデックスデータを取得しています。コストは、システムコール、デバイスとの通信、ディスクの物理的な動き(腕の動き+回転)です。

実際には、システムが非常にビジーでない限り、1と2の違いはほとんど目立ちません。また、シナリオ3が機能するのは、システムのスペアRAMがディスクコントローラーより少ない場合を除く)ではありません。

比較的小さなインデックスキャッシュ(512MB)のMyISAMテーブルを持つサーバーを使用しましたが、システムメモリ(64GB)が非常に大きいため、インデックスキャッシュのサイズを増やすことの価値を実証するのは困難でした。それはあなたのサーバーで他に何が起こっているかによると思います。実行しているのがMySQLデータベースだけである場合、OSキャッシュが非常に効果的である可能性が非常に高くなります。ただし、同じサーバー上で他のジョブを実行し、これらが大量のメモリ/ディスクアクセスを使用する場合、これらはキャッシュされた貴重なインデックスブロックを排除し、MySQLがディスクに頻繁にヒットする可能性があります。

おもしろい練習(時間がある場合)は、システムをいじって、実行速度を遅くすることです。大きなテーブルで標準のワークロードを実行し、影響が顕著になるまでMySQLバッファーを減らします。大量の(RAMを超える)無関係なデータをファイルシステムからポンピングすることにより、ファイルシステムキャッシュをフラッシュします(cat large-file>/dev/null)。クエリの実行中にiostatを監視します。

「キー効率」は、キーがどれだけ優れているかの尺度ではありません。適切に設計されたキーは、高い「キー効率」よりもパフォーマンスにはるかに大きな影響を与えます。残念ながら、MySQLにはそこに役立つものはあまりありません。

81
Martin

Key_read_requestsは、キャッシュからキーブロックを読み取る要求の数です。 key_readsは、ディスクからのキーブロックの物理的な読み取り数です。したがって、これら2つの変数は独立して増加できます。 ( http://bugs.mysql.com/bug.php?id=28384

それはまだ泥と同じくらい明確です。

次の説明に進みます。

Key_readsの部分的に有効な使用

ディスクがコンピューターの他の部分に比べて非常に遅いことがわかっているため、発生する物理読み取りの数に注意を払うことを前提として、Key_readsを検査する部分的に正当な理由があります。 Key_readsは実際には物理的なディスク読み取りではないため、ここで上記の「ほぼ事実」と呼んでいるものに戻ります。要求されたデータブロックがオペレーティングシステムのキャッシュにない場合、Key_readはディスク読み取りです。ただし、キャッシュされている場合は、単なるシステムコールです。ただし、証明するのが難しい最初の仮定を行いましょう。

証明しにくい仮定#1:Key_readは、おそらく物理ディスクの読み取りに対応する可能性があります。この仮定を真とすると、Key_readsを気にする他の理由は何でしょうか?この仮定により、「キャッシュミスはキャッシュヒットよりも大幅に遅くなる」ことになります。 Key_read_requestと同じくらい速くKey_readを実行する場合、とにかくキーバッファーはどのように使用されますか?キャッシュヒットはミスよりも速くなるように設計されているため、MyISAMのクリエーターを信頼してみましょう。 ( http://planet.mysql.com/entry/?id=23679

7
Michael Eakins