mysql で in がインデックスを使用するかどうかには 2 つのケースがあります: 1. in の値の範囲が小さい場合、in はインデックスを使用します; 2. in の値の範囲が大きい場合、in はインデックスを使用しませんインデックスを使用する代わりに、テーブル全体のスキャンが使用されます。 in 条件が多すぎると大量のデータが返されるため、アプリケーション ヒープでメモリ オーバーフローが発生し、インデックス エラーが発生する可能性があります。
![mysqlでインデックスを使用しますか?](https://img.php.cn/upload/article/202205/27/2022052715342314249.jpg)
このチュートリアルの動作環境: Windows10 システム、mysql8.0.22 バージョン、Dell G3 コンピューター。
mysql でインデックスを使用しますか?
結論: IN は間違いなくインデックスを使用しますが、IN の値の範囲が大きい場合、インデックスのエラーが発生し、フル テーブル スキャンが使用されます。
navicat 視覚化ツールは、explain 関数を使用して SQL 実行情報を表示します
シナリオ 1: IN の値に主キーが 1 つだけある場合
![1653636979228381.png mysqlでインデックスを使用しますか?](https://img.php.cn/upload/image/142/140/844/1653636979228381.png)
注意する必要があるのは、最も重要な型情報の 1 つは、インデックスが使用されているかどうかであることは明らかです:
型結果の値を最良から最悪まで次のとおりです:
system > const > eq_ref > ref > fulltext > ref_or_null > Index_merge > unique_subquery > Index_subquery > range > Index > ALL
all: フル テーブル スキャン
index: 別の形式フルテーブルスキャン、それは彼のスキャン方法がインデックスの順序であるというだけです
range: 範囲インデックススキャン. インデックスのフルテーブルスキャンと比較して、範囲制限があるため、インデックスよりも優れています
ref : 検索条件列はインデックスを使用しており、主キーまたは一意ではありません。実際には、インデックスが使用されているにもかかわらず、インデックス列の値が一意ではなく、重複があることを意味します。このように、インデックスを使用して最初のデータがすぐに見つかったとしても、停止することはできず、ターゲット値に近い狭い範囲をスキャンする必要があります。ただし、インデックスが順序付けされており、重複する値があったとしても非常に狭い範囲でスキャンされるため、テーブル全体をスキャンする必要がないという利点があります。
const: 通常、条件付きクエリとして主キーが where の後に配置されている場合、mysql オプティマイザーはクエリを最適化し、それを定数に変換できます。いつ、どのように変換するかについては、オプティマイザによって異なります。
一般的に、クエリが少なくとも範囲レベル (できれば ref) に達するようにする必要があります。index と all が type に表示される場合、それは意味します。テーブル全体が使用されるスキャンはインデックスを使用しないため非効率的であり、この場合は SQL をチューニングする必要があります。
「Extra」が「Using files」または「Using temproary」と表示された場合は、インデックスが使用できないため、できるだけ早く最適化を行う必要があることを意味します。
possible_keys: SQL で使用されるインデックス
key: MySQL が実際に使用することを決定したキー (インデックス) を表示します。インデックスが選択されていない場合、キーは NULL
rows: MySQL がクエリの実行時に検査する必要があると考える行数を表示します。
シナリオ 2: IN の値の範囲を拡張する
![1653637008592473.png mysqlでインデックスを使用しますか?](https://img.php.cn/upload/image/820/662/469/1653637008592473.png)
現時点でもインデックスは使用されていますが、効率は低下します
シナリオ 3: IN
![1653637021448827.png mysqlでインデックスを使用しますか?](https://img.php.cn/upload/image/808/808/476/1653637021448827.png)
の値の範囲を拡大し続ける 上の図を見ると、現時点ではインデックスがなく、テーブル全体のスキャンが行われていることがわかります。
結論について話しましょう
結論: IN は間違いなくインデックスを使用しますが、IN の値の範囲が大きい場合、インデックスが失敗し、テーブル全体のスキャンが使用されます。
ちなみに、not in を使用するとインデックスは使用されません。
推奨学習:
mysql ビデオ チュートリアル
以上がmysqlでインデックスを使用しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。