MySql 範囲内の検索時にインデックスが有効にならない理由の分析

MySql 範囲内の検索時にインデックスが有効にならない理由の分析

1 問題の説明

この記事では、確立された複合インデックスをソートし、レコード内の非インデックス フィールドを取得します。インデックスが有効でないことがわかります。たとえば、次のテーブルがあり、DDL ステートメントは次のとおりです。

テーブル「従業員」を作成します(
 `emp_no` int(11) NULLではない、
 `birth_date` 日付がNULLではない、
 `first_name` varchar(14) NOT NULL,
 `last_name` varchar(16) NOT NULL,
 `性別` enum('M','F') NOT NULL,
 `hire_date` 日付がNULLではない、
 `age` int(11) NOT NULL,
 主キー (`emp_no`)、
 キー `unique_birth_name` (`first_name`,`last_name`) BTREE の使用
 )ENGINE=InnoDB デフォルト文字セット=utf8;

複合インデックスはunique_birth_name (first_name,last_name)です。次の文を使用します。

説明選択
 性別
から
 従業員
注文する
 ファーストネーム、
 苗字

這里寫圖片描述

上図によると、type:all および Extra:Using filesort の場合、インデックスは有効ではありません。

実験を続行し、クエリ ステートメントをさらに書き直して範囲検索を追加します。

説明選択
 性別
から
 従業員
WHERE first_name > 'Leah'
注文する
 ファーストネーム、
 苗字

実行プランは次の図に示されています。

這里寫圖片描述

ここでの結果は最初の SQL 分析と変わりません。実験を続けてください。

SQL ステートメントを書き直します。

説明選択
 性別
から
 従業員
WHERE first_name > 'Tzvetan'
注文する
 ファーストネーム、
 苗字

這里寫圖片描述

この時点で、驚くべきことに、インデックスは機能します。

2 問題分析

この時点で、私たちは大胆な推測をします。

初めてSQL分析を実行する場合、最初のorder byの後はテーブル全体のデータがまだ取得されるため、複合インデックスに保持されている主キーに従って各性別を検索して結合すると、当然、非常に多くのリソースと時間がかかります。MySQLはそのような愚かなことはしません。テーブル全体を直接スキャンし、スキャンした各データを order by で取得した一時データと連結して、必要なデータを取得する方がよいでしょう。

上記のアイデアの正しさを検証するために、3 つの SQL ステートメントを分析します。

複合インデックスに基づく最初のSQLで取得されるデータの量は300024で、これはテーブル全体のデータです。

選択
 COUNT(名)
から
 従業員
注文する
 ファーストネーム、
 苗字

這里寫圖片描述

複合インデックスに基づいて書き換えられた 2 番目の SQL によって取得されるデータ量は159149で、これはテーブル全体のデータ量の 1/2 です。

選択
 COUNT(名)
から
 従業員
WHERE first_name > 'Leah'
注文する
 ファーストネーム、
 苗字

這里寫圖片描述

複合インデックスに基づいて書き換えられた 3 番目の SQL によって取得されるデータ量は36731で、これはテーブル全体のデータ量の 1/10 です。

選択
  COUNT(名)
から
  従業員
WHERE first_name > 'Tzvetan'
注文する
  ファーストネーム、
  苗字

這里寫圖片描述

比較すると、複合インデックスに基づいて書き換えられた 2 番目の SQL によって取得されたデータ量は、テーブル全体のデータ量の 1/2 であることがわかりました。この時点では、MySQL はまだ二次検索にインデックスを使用するレベルには達していません。複合インデックスを元に書き換えた3番目のSQLで取得するデータ量は、テーブル全体のデータ量の1/10となり、二次検索にインデックスを使ったMySQLのレベルに達しています。そのため、実行プランから書き換えた3番目のSQLはインデックスを使ったことがわかります。

3 結論

MySQL が最初のインデックス条件から照会された主キーに基づいて二次検索を実行するかどうかは、照会されたデータの量によっても異なります。データ量がテーブル全体のデータ量に近い場合は、フルテーブルスキャンが実行されます。それ以外の場合は、最初に照会された主キーに基づいて二次検索が実行されます。

これで、MySql 範囲検索中にインデックスが有効にならない問題の原因分析に関するこの記事は終了です。MySql 範囲検索中にインデックスが有効にならない問題に関する関連コンテンツの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL でインデックス構造として B+ ツリーを使用する利点は何ですか?
  • MySQL データベース インデックスが B+ ツリーの使用を選択するのはなぜですか?
  • MySQL全文インデックスの原理と欠点
  • MySQL 5.6 の「暗黙的な変換」によりインデックスが失敗し、データが不正確になる
  • MySQLインデックスが失敗するいくつかの状況の詳細な分析
  • MySQL 8.0 の降順インデックス
  • MySQL 8.0 のインデックス スキップ スキャン
  • MySQL パフォーマンス最適化インデックス最適化
  • MySQL で B+ ツリー インデックスを使用する利点は何ですか?

<<:  XHTMLにおけるH1タグの位置について

>>:  iOS、Android、ミニプログラムアプリの敷居の低い開発のためのフロントエンドフレームワークを詳しく解説

推薦する

選択にスタイルを追加するための純粋な CSS (スクリプトなし) 実装

通常は ul、li を介して選択のデフォルト スタイルを変更して、実現をシミュレートします。このよう...

この記事では、jsのデータ型とデータ構造の世界を紹介します。

目次1. 動的型付けとは何ですか? 2. データ型2.1 プリミティブ型 (6 つのプリミティブ型、...

Linux での中国語入力方法の問題を素早く解決する

背景: 最近、資産報告関連の機能に取り組んでおり、中国語入力をサポートする必要があります。通常のショ...

IDEA の Docker プラグインを介して SpringBoot プロジェクトをデプロイするプロセスの詳細な説明

1. Dockerリモート接続ポートを設定するサーバー上の docker.service ファイルを...

MySQL の完全バックアップ中に特定のライブラリを除外する方法

MySQLの完全バックアップを実行するときは、--all-databaseパラメータを使用します。例...

WeChatミニプログラムで検索キーワードを強調表示するサンプルコード

1. はじめにプロジェクトで要件に遭遇したら、データを検索してキーワードを強調表示します。要件を受け...

色の16進数カラーコード表表示と16進値の比較表示で簡単に検索できます

さまざまな色の16進コード表[パート1] 赤とピンク、およびそれらの 16 進コード。 #99003...

重複データの処理に関するMySQL学習ノート

MySQLは重複データを処理します一部の MySQL テーブルには重複レコードが含まれている場合があ...

UbuntuでGRUBの起動時間を変更する

grubの起動時間を変更するためのオンライン検索は基本的に/etc/default/grubを変更す...

Navicat for MySQL チュートリアル

まず、Navicat for MySQL をダウンロードしてインストールする必要があります。正規版の...

フォーム送信時に追加のパラメータを渡すためのいくつかの一般的な方法

フォームを送信するときに、送信前に追加のパラメータが追加される状況が発生する場合があります。この問題...

html の img src="" で js 関数または js 変数を呼び出して、画像パスを動的に指定します。

この問題に関して、オンライン リソースをたくさん見つけました。ここにいくつかの方法を示します。コード...

コンテンツタイプの説明、つまりHTTPリクエストヘッダーのタイプ

コンテンツ タイプについて学ぶには、まずそれが何であるか、そして何に使用されるかを知る必要があります...

Windows 10 に Linux サブシステムをインストールする 2 つの方法 (画像とテキスト付き)

Windows 10 は Linux サブシステムをサポートするようになり、面倒なデュアル システ...

Linux (Ubuntu) での MySQL 5.7.17 のインストールと設定のチュートリアル

序文以前、MySQL 5.6 をインストールしました。3 か月後、開発者から MySQL で JSO...