MySQL インデックス使用状況監視スキル (収集する価値あり!)

MySQL インデックス使用状況監視スキル (収集する価値あり!)

概要

リレーショナル データベースでは、インデックスは、データベース テーブル内の 1 つ以上の列の値を並べ替える、独立した物理的なストレージ構造です。これは、テーブル内の 1 つ以上の列の値のコレクションと、これらの値を物理的に識別するテーブル内のデータ ページへの対応する論理ポインターのリストです。

MySQL はハッシュ インデックスと Btree インデックスをサポートしています。 InnoDB と MyISAM は Btree インデックスのみをサポートしますが、Memory および Heap ストレージ エンジンはハッシュ インデックスと Btree インデックスの両方をサポートできます。

1. 現在のインデックスの使用状況を表示する

次のステートメントを使用して、現在のインデックスの使用状況を照会できます。


  • Handler_read_first は、インデックス ヘッダーが読み取られる回数を表します。この値が高い場合、完全なインデックス スキャンが多数行われていることを意味します。
  • Handler_read_key はインデックスが使用された回数を表します。新しいインデックスを追加すると、Handler_read_key が増加したかどうかを確認できます。増加した場合、SQL がインデックスを使用していることを意味します。
  • Handler_read_next は、インデックスの次の要素の読み取りを表し、通常は範囲スキャンが実行されます。
  • Handler_read_prev は、インデックスの前の列の読み取りを表します。これは通常、ORDER BY ... DESC で発生します。
  • Handler_read_rnd は、固定位置での行の読み取りを表します。この値が高い場合、多数の結果セットがソートされ、完全なテーブル スキャンが実行され、関連するクエリで適切なキーが使用されていないことを意味します。
  • Handler_read_rnd_next は、多くのテーブル スキャンが実行され、クエリのパフォーマンスが低下していることを示します。

実際、多くのアプリケーション シナリオでは、インデックスが動作しているとき、Handler_read_key の値は非常に高くなります。この値は、行がインデックス値を読み取る回数を表します。値が非常に低い場合、インデックスが頻繁に使用されないため、インデックスを追加することで得られるパフォーマンスの向上は大きくないことを示します。

Handler_read_rnd_next の値が高い場合、クエリが非効率的に実行されており、インデックス作成によって修正する必要があることを意味します。この値は、データ ファイル内の次の行を読み取る要求の数を意味します。大量のテーブル スキャンが実行されている場合、Handler_read_rnd_next の値が高いことは通常、テーブルが正しくインデックス付けされていないか、書き込まれたクエリがインデックスを活用していないことを示します。

2. インデックスが使用されているかどうかを確認する

選択
 オブジェクトタイプ、
 オブジェクトスキーマ、
 オブジェクト名、
 インデックス名、
 カウントスター、
 カウント_読み取り、
 COUNT_FETCH 
から
 PERFORMANCE_SCHEMA.table_io_waits_summary_by_index_usage;

読み取りとフェッチの数が両方とも 0 の場合は、使用されていないことを意味します。



3. 使用されているインデックスを確認する

関連するSQLを説明し、クエリでどのインデックスタイプが使用されているかを確認します。

+-----+-------+-------+-------+--------+--------+--------+-------+
| ALL | インデックス | 範囲 | ref | eq_ref | const | システム | NULL |
+-----+-------+-------+-------+--------+--------+--------+-------+

最高から最低の順に次のとおりです。

システム > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
  • システム テーブルにはレコードが 1 つだけ存在し、通常はシステム テーブルにのみ表示されます。
  • const は、クエリが単一のインデックス クエリを通じて見つかることを意味します。通常、対応するインデックス列は primarykey であるか、または一意の where ステートメントで定数が指定されます。一致するデータは 1 行のみであるため、MYSQL はこのクエリを定数に最適化できるため、非常に高速です。
  • eq_ref 一意のインデックススキャン。このタイプは通常、複数テーブルの結合クエリで使用されます。前のテーブルから接続された対応する列ごとに、現在のテーブルの対応する列には一意のインデックスがあり、それに一致するデータは最大で 1 行のみです。
  • ref 非一意インデックススキャン。上記と同じですが、現在のテーブルの対応する列には一意のインデックスがなく、一致するデータの行が複数ある可能性があります。このタイプのクエリは通常、複数テーブルの結合クエリ、一意でないキーまたは主キーでないインデックスに対するクエリ、または左端のプレフィックス ルール インデックスを使用するクエリで発生します。
  • 範囲インデックスに対する範囲クエリ。インデックスキーワードの範囲の値を照会します。
  • インデックス 全文インデックススキャン。基本的にすべてと同じで、テキスト全体がスキャンされますが、クエリされたフィールドはインデックスに含まれるため、テーブル内のデータを読み取る必要はなく、インデックス ツリー内のフィールドのみを読み取る必要があります。
  • すべて全文スキャン。インデックスは使用されない為、効率は最も低くなります。

ちなみに、最適化のポイントをいくつか挙げます。

1. 挿入ステートメントを最適化します。

1) テスト値()、()、()、() に挿入してみます。
2) 異なる顧客から複数の行を挿入する場合、INSERT 遅延ステートメントを使用すると、速度を上げることができます。遅延とは、INSERT ステートメントがすぐに実行されることを意味します。実際には、データはメモリ キューに配置され、実際にはディスクに書き込まれません。これは、各ステートメントを個別に挿入するよりもはるかに高速です。Low_priority は正反対です。挿入は、他のすべてのユーザーがテーブルの読み取りと書き込みを終了した後に実行されます。
3) インデックスファイルとデータファイルを別のディスクに保存する(テーブル作成ステートメントを使用)
4) バッチ挿入を実行している場合は、bulk_insert_buffer_size 変数値を増やして速度を上げることができますが、これは MyISAM テーブルの場合のみです。
5) テキストファイルからテーブルをロードする場合は、データファイルのロードを使用します。これは通常、挿入を使用するよりも20倍高速です。

2. group by ステートメントを最適化します。

デフォルトでは、MySQL はすべての group by フィールドをソートします。これは order by に似ています。クエリに group by が含まれているが、ユーザーが並べ替えられた結果の使用を避けたい場合は、order by null を指定して並べ替えを抑制できます。

3. order by ステートメントを最適化します。

場合によっては、MySQL はインデックスを使用して ORDER BY 句を満たすことができるため、追加のソートが不要になります。 where 条件と order by は同じインデックスを使用し、order by 順序はインデックス順序と同じで、order by フィールドは昇順または降順になります。

4. ネストされたクエリを最適化する:

MySQL 4.1 ではサブクエリのサポートが開始されましたが、場合によっては、特に結合するパッシブ テーブルにインデックスがある場合、サブクエリをより効率的な結合に置き換えることができます。その理由は、MySQL では、論理的に 2 つの手順を必要とするこのクエリを完了するために、メモリ内に一時テーブルを作成する必要がないためです。

最後に、ポイント:

テーブルには最大 16 個のインデックスを設定でき、インデックスの最大長は 256 バイトです。インデックス作成の時間オーバーヘッドは O(1) または O(logN) であるため、インデックスは一般に挿入パフォーマンスに大きな影響を与えません (大量の小さなデータを除く)。ただし、インデックスが多すぎるのも良くありません。結局のところ、更新などの操作ではインデックスの維持が必要になります。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • MySQL インデックスタイプの概要と使用上のヒントと注意事項
  • MySQLインデックスの使用に関するヒントと注意事項
  • MySQLデータベース最適化技術とインデックス使用スキルの概要
  • MySQL インデックスクエリ最適化スキルを習得するための記事
  • MySQL インデックスに関するヒントのまとめ

<<:  Vite2+Vue3を使用してMarkdownドキュメントをレンダリングする練習

>>:  Linuxのwatchコマンドの使用

推薦する

MySQL データベース内の同じテーブルを同時にクエリして更新する方法

通常のプロジェクトでは、1 回の入札で同時にデータを更新および照会する必要があるという問題によく遭遇...

HTMLは角丸四角形を簡単に実装します

質問: div+css と配置を使用して角丸四角形を実現するにはどうすればよいですか?ソリューション...

MySQLデータベースに画像を保存するいくつかの方法

通常、ユーザーがアップロードした写真はデータベースに保存する必要があります。一般的に、解決策は 2 ...

node-media-serverを使用してシンプルなストリーミングメディアサーバーを構築する

node-media-server を使用するプロセスの一部を記録します。この記事の環境はWindo...

MySQLデータテーブルの基本操作:テーブル構造の操作、フィールド操作例の分析

この記事では、テーブル構造操作やフィールド操作など、MySQL データ テーブルの基本的な操作につい...

クールなIoT大画面機能を実現するHTML+VUEページング

効果デモ.html <html> <ヘッド> <メタ文字セット=&qu...

ウェブページのFOUC問題によるウェブページの混乱の解決策

FOUC は Flash of Unstyled Content の略で、FOUC と略されます。簡...

MySQL の遅いクエリを見つける方法

序文誰もが日常業務で SQL の最適化を経験したことがあると思います。したがって、最適化の前に、遅い...

MySQL インデックスの左端原則のサンプルコード

序文最近、MySQL のインデックスについて読んでいました。結合されたインデックスを見ると、左端の原...

mysql 5.7.17 winx64.zip インストールと設定方法のグラフィックチュートリアル

はじめに: Windows 10 を再インストールし、同時にファイルを整理しました。しかし、MySQ...

Nginx における 2 つの現在の制限方法についての簡単な説明

負荷は通常、システム設計時に予測されます。システムがパブリック ネットワークに公開されている場合、悪...

JavaScriptのアロー関数の特徴と通常の関数との違い

目次1. 矢印関数の使用1. 通常関数から矢印関数へ2. 中括弧を省略してリターンする3. 括弧を省...

誰もが登録できるようにJiedaibaoを宣伝するにはどうすればよいでしょうか? ジエダイバオのプロモーション方法とスキル

借財宝は最近人気が出ている携帯電話ローンソフトウェアプラットフォームです。知人同士の貸し借りが特徴で...

Nginx で Http、Https、WS、WSS を設定する方法

前面に書かれた今日のインターネット分野では、Nginx は最も広く使用されているプロキシ サーバーの...

mysql 実行プラン ID が空である (UNION キーワード) の詳細な説明

導入作業プロセス中に、遅いクエリが調整されることがあります。 MySQL SQL ステートメントのチ...