MySQLのSQL文はインデックスを使用しません

MySQLのSQL文はインデックスを使用しません

インデックス集約を使用しない MySQL クエリ

ご存知のとおり、インデックスを追加することはクエリ速度を向上させる効果的な方法です。ただし、多くの場合、インデックスを追加してもクエリはインデックスを使用しないため、パフォーマンスに重大な影響を及ぼします。ここでは、MySQL がインデックスを使用しない簡単な例をいくつか示します。

MySQL は、インデックスを使用するとテーブル全体のスキャンよりも遅くなると予測した場合、インデックスを使用しません。たとえば、列キーselect * from table_name where key>1 and key<90;

MEMORY/HEAP テーブルを使用し、列のインデックス付けに where 条件で "=" を使用しない場合、インデックスは使用されません。ヘッド テーブルは、"=" 条件が使用されている場合にのみインデックスを使用します。

or で区切られた条件の場合、条件内の or の前の列にインデックスがあり、その後の列にインデックスがない場合は、関連するインデックスは使用されません。たとえば、 select * from table_name where key1='a' or key2='b';の場合、key1 にはインデックスがあるが key2 にはない場合、クエリはインデックスを使用しません。

複合インデックスの場合、インデックス列が複合インデックスの最初の部分でない場合、インデックスは使用されません(つまり、左端のプレフィックスを満たしません)。たとえば、複合インデックスが (key1, key2) の場合、クエリselect * from table_name where key2='b';インデックスを使用しません。

like が '%' で始まる場合、その列のインデックスは使用されません。たとえば、 select * from table_name where key1 like '%a' ; このクエリは、key1 にインデックスがあっても使用されません。

列が文字列の場合、文字定数値は where 条件で引用符で囲む必要があります。そうしないと、列にインデックスが存在しても使用されません。たとえば、 select * from table_name where key1=1;場合、key1 列に文字列が格納されていると、key1 にインデックスがあっても使用されません。

上記から、インデックスを作成しても使用されない可能性があることがわかります。では、インデックスの使用状況をどのように確認すればよいのでしょうか? ? MySQL には、 Handler_read_keyHandler_read_rnd_keyという 2 つの変数があります。Handler_read_key の値が非常に高く、Handler_read_rnd_key の値が非常に低い場合は、インデックスがあまり使用されていないことを意味し、インデックスの作成を再検討する必要があります。これら 2 つのパラメータの値は、 show status like 'Handler_read%'を通じて表示できます。

MySQL インデックスを正しく作成する方法の詳細については、MySQL インデックスを正しく作成する方法の詳細な説明を参照してください。ご存知のとおり、テーブル インデックスは、データ取得の効率を向上させ、データベース IO コストを削減し、データベースのソート コストを削減できます。ただし、インデックスは常に効果的であるとは限りません。たとえば、次の状況ではインデックスが失敗します。

1. 条件に or がある場合、条件にインデックスがあってもインデックスは使用されません (SQL 文で or ができるだけ使用されないようにするのはこのためです)

注: または を使用してインデックスを有効にする場合は、または条件内の各列にのみインデックスを追加できます。

2. 複数列のインデックスの場合、最初の部分でない限りインデックスは使用されません。

3. like クエリが % で始まる場合、インデックスは使用されません。

4. 列の型が文字列の場合、条件内でデータを引用符で囲む必要があります。そうしないと、インデックスは使用されません。

5. MySQL がフルテーブルスキャンの方がインデックスよりも高速であると判断すると、インデックスは使用されません。

さらに、インデックスの使用状況を表示します

「Handler_read%」のようなステータスを表示します。

誰もが注目できる点:

handler_read_key : 値が高いほど良いです。値が高いほど、インデックスがクエリに使用される回数を示します。

handler_read_rnd_next : この値が高いほど、クエリの効率は低下します。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • MySQLストレージ時間タイプの選択に関する問題の説明
  • MySQL における 10 進数型の使用法の簡単な紹介
  • あるテーブルのデータの列を別のテーブルの列にコピーするMySQLメソッド
  • MySQL Limitクエリのパフォーマンスを向上させる方法
  • MySQL マスター/スレーブ データベース同期構成と一般的なエラー
  • Mysql Explainコマンドの使用と分析
  • MySQLインデックスを正しく作成する方法
  • MySQL での replace と replace into の使い方の説明
  • MySQL スロークエリを通じて MySQL のパフォーマンスを最適化する方法
  • MySQL コマンドを使用してインデックスを作成、削除、およびクエリする方法の紹介

<<:  JavaScript による省・市連携効果の実現

>>:  Vue vee-validateプラグインの簡単な使い方

推薦する

CPU、マシンモデル、メモリなどの情報を表示するLinuxシステム

システムメンテナンス中は、いつでも CPU 使用率を確認し、対応する情報に基づいてシステムの状態を分...

MySQL で GTID モードをオンラインで有効または無効にする

目次基本的な概要GTIDをオンラインで有効にする1. GTID検証ENFORCE_GTID_CONS...

UDP 接続オブジェクトの原理分析と使用例

以前、UDP を使い始めるために簡単な UDP サーバーとクライアントの例を作成しましたが、実際に使...

case when文のエラー問題の詳細な説明

序文MySQL データベースでは、if else のような判断演算を使用することがあります。では、M...

背景画像にテキストを表示するためのCSS

効果: <div class="imgs"> <!-- 背景画...

WeChatアプレットコンポーネントライフサイクルの落とし穴の記録

通常、コンポーネントのライフサイクルは、ビジネス ロジックが始まる場所です。ビジネスシナリオが複雑で...

Linux 上の MYSQL 5.7 でルート パスワードを取得する際の問題 (テスト済み、利用可能)

目次1. --skip-grant-tables 経由で取得する1.1 my.conf を変更し、新...

Vue3 シングルファイルコンポーネントのスタイル機能の詳細な説明

目次スタイルスコープスタイルモジュール状態駆動型動的CSS要約するスタイルスコープ注意事項:スタイル...

ポータルサイト再設計のユーザーエクスペリエンス

<br />2006年10月12日のNetEaseの新ホームページの公開から、2008年...

ローカル写真をアップロードする前にプレビューコード例を実装するための HTML5 と jQuery

HTML5 と jQuery はアップロード前にローカル画像のプレビューを実装しており、その効果は...

Linux システムで HugePages をすばやく構成するための完全な手順

序文Linux システムの HugePages と Oracle データベースの最適化については、関...

Alibaba Cloud MySQL スペースをクリーンアップする方法

今日、Alibaba Cloudからディスク警告通知を受け取りました。確認したところ、100Gのスペ...

回転するフリップカードアニメーションの効果を実現するCSS

回転フリップ効果の CSS アニメーション、具体的な内容は次のとおりです。 1. まず2つのボックス...

canvas.toDataURL image/png エラー処理方法の推奨

問題の背景:再生中のビデオのスクリーンショットを撮る必要があります。ビデオはビデオタグを使用して再生...

レンダリング関数と JSX の詳細

目次1. 基本2. ノード、ツリー、仮想DOM 1. 仮想DOM 3. createElementパ...