MySQL の LIKE クエリはインデックスを使用できますか

単一列インデックス

like x% クエリを使用するとインデックスを使用できますが、like %x% および like %x クエリを使用するとインデックスを使用できません

では、%x% クエリや %x% クエリにインデックスを使用できないのはなぜでしょうか?
インデックスは順序付けられた B+ ツリーのデータ構造であるため、リーフ ノードは左から右に順番に配置されます。テーブル全体をスキャンするため、理解しやすい

複合インデックス

username フィールドと age フィールドを結合インデックスとして使用し、index_username_age という名前を付けます。

x%のように使用

ここに画像の説明を挿入
EXPLAIN 実行計画から、like x% を使用するクエリが index_username_age ジョイント インデックスを使用していることがわかります。タイプは範囲です。これは、これがインデックスの範囲スキャンであることを意味します (あいまい一致であり、あいまい一致が形成される可能性があるため)。 Extra は Using where;Using index であり、インデックスが使用されていることを示していますが、フィルタリングはまだ必要です

%x% のように使用

ここに画像の説明を挿入

%x のように使用

ここに画像の説明を挿入
like %x% および like %x を使用した実行計画から判断すると、それらのタイプは index であり、インデックス B+ Tee をトラバースしたことを示し、Extra は Using where; Using index は、インデックスが使用されていることを示しますが、必要があることを示しますフィルタリングされる

では、like %x% および like %x クエリを使用するときに、インデックス B+ Tee 全体をトラバースする必要があるのはなぜですか? ジョイント インデックス index_username_age の場合、ユーザー名フィールドを使用してインデックス B+ Tee を作成および維持するため. 当然、葉ノードのユーザー名フィールドは整然と配置されますが、年齢フィールドは順序付けされていません。同様に、age フィールドは順序付けられているため、like %x% および like %x クエリを使用すると、どちらから始めればよいか分からず、テーブル全体をスキャンすることになります。

結論は

like x% を使用する
共同インデックスでは、like x% クエリを使用してインデックスを使用できます。カバー インデックスを使用する場合でも、すべてのフィールドをクエリする場合でも、インデックスを使用してクエリの効率を向上させることができます。
like %x% and like %x を使用して
、カバリング インデックスを使用します。インデックスは使用されますが、インデックス B+ Tee 全体をトラバースし、条件を満たすデータを除外して、
すべてのフィールドをクエリする必要があります。この時点で、結合インデックス index_username_age 全体のインデックス B+ ティーを読み取ってトラバースする必要があり、条件に一致するデータを除外します. アドレス フィールドの値は結合インデックスに保存されないため、元に戻る必要があります。テーブルを検索し、主キー インデックスで対応するレコードを検索します。

おすすめ

転載: blog.csdn.net/yzx3105/article/details/130428478