2017-12-11 9 views
-3

MySQLのテーブル構造体 enter image description here enter image description here enter image description here enter image description hereMySQLの範囲クエリ、大規模な使用のインデックス裁判官範囲

それは、私は混乱しますMySQLでクエリの範囲影響の使用インデックス !!!!!!!!!場合!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!簡単で

+1

スクリーンショットを使用するのではなく、質問にSQLを追加してください。また、助けが必要なものを示す簡潔な質問と、何が壊れているかを示すコードの縮小バージョンを含めてください。 – Hans

答えて

0

、私は、MySQLデータベース が EXPLAIN SELECT * FROM t_teacher_course_info WHERE teacher_id >1 and teacher_id < 5000 を実行使用すると、すべてのt_teacher_course_infoインデックスINDEX `idx_teacher_id_last_update_time` (`teacher_id`, `last_update_time`)

が、変化範囲 EXPLAIN SELECT * FROM t_teacher_course_info WHERE teacher_id >1 and teacher_id < 10000 ID SELECT_TYPEのテーブル型possible_keysかのキーkey_lenにREF行エクストラ

1 1 SIMPLEを使用します。 idx_teacher_update_time 671082使用方法

すべてのテーブルをスキャンし、インデックスを使用しないでください。 ny mysql config インデックスを使用する場合は、おそらく行数判定をスキャンします。 !!!!!!!

0

これは何が起こるかです。それは実際には最適化です。

(例えばINDEX(teacher_id)など)二次キーを使用する場合は、処理は次のように進む:

  1. リーチB +ツリーインデックスである、に。このような構造では、特定の値(例えば、1)を見つけて、前方にスキャンする(5000または10000まで)ことは非常に効率的です。
  2. 各エントリについて、行にフェッチするデータに手を差し伸べてください(SELECT *)。これは、PRIMARY KEYを使用します。コピーはセカンダリキーにあります。 PKとデータは一緒にクラスタリングされます。 1つのPK値による各ルックアップは効率的です(再び、BTree)が、5000または10000を実行する必要があります。したがって、コスト(時間がかかる)が加算されます。

A「テーブル・スキャン」(すなわち、任意のINDEXを使用していないが)このように書きます:

  1. スタートをテーブルの先頭に、PKの順に(テーブル用のB +ツリーを歩きます) 終わりまで。
  2. 各行について、WHERE句(teacher_idの範囲)を確認します。

テーブルの20%以上を調べる必要がある場合、テーブルスキャンは実際にはセカンダリインデックスとデータの間を行き来するよりも高速です。

したがって、「大」は約20%程度です。実際の値は表の統計などに依存します。

最終行:オプティマイザにその処理を任せます。 最もよく知っているのはです。

+0

私はそれをありがとう、:) –

関連する問題