mysqlインデックスの最も左のマッチングの原則の理解

1878 ワード

網易の面接で聞いたのを覚えていますが、アリも会いました.
テーブルの作成
create table test(
a int ,
b int,
c int,
d int,
key index_abc(a,b,c)
)engine=InnoDB default charset=utf8;

10,000個のデータを挿入
DROP PROCEDURE IF EXISTS proc_initData;
DELIMITER $
CREATE PROCEDURE proc_initData()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=10000 DO
    INSERT INTO test(a,b,c,d) VALUES(i,i,i,i);
    SET i = i+1;
END WHILE;
END $
CALL proc_initData();

連合インデックス(a,b,c)が確立された
検証:
explain命令の詳細は表示できます
https://www.cnblogs.com/gomysql/p/3720123.html
explain select * from test where a<10 ;
explain select * from test where a<10 and b <10;
explain select * from test where a<10 and b <10 and c<10;
a,bの出現順序を変えて、a,b,cの出現順序を変えてもいいですか.
explain select * from test where b<10 and a <10;
explain select * from test where b<10 and a <10 and c<10;
最も左のマッチングの原則ではありませんか?
資料を調べてみると、mysqlクエリー・オプティマイザは、このsql文をどのような順序で実行するのが最も効率的であるかを判断し、最後に本当の実行計画を生成することができます.したがって、インデックスにできるだけ利用できるクエリの順序が最も効率的であることはもちろんですが、mysqlクエリオプティマイザは最終的にこの順序でクエリを実行します.
ポイントが来た
explain select * from test where b<10 and c <10;、
explain select * from test where a<10 and c <10;
なぜb<10 and c<10はインデックスを使用しないのですか?a<10 and c<10は?
b+ツリーのデータ項目が複合的なデータ構造、例えば(name,age,sex)である場合、b+数は左から右の順に検索ツリーを構築し、例えば(張三,20,F)のようなデータが検索されると、b+ツリーはnameを優先的に比較して次の検索方向を決定し、nameが同じであればageとsexを順次比較し、最後に検索データを得る.しかし(20,F)のようなnameのないデータが来ると,b+ツリーは次にどのノードを調べるべきか分からない.検索ツリーを構築する際にnameが最初の比較因子であり,まずnameに基づいて検索しなければ次のクエリがどこに行くか分からないからである.例えば(張三,F)のようなデータを検索する場合、b+ツリーはnameで検索方向を指定することができるが、次のフィールドageが欠けているため、名前が張三に等しいデータしか見つからず、性別がFのデータに一致することが重要である.これはインデックスの最も左の一致特性である.
リファレンス
https://blog.csdn.net/qq_24690761/article/details/52787897
https://blog.csdn.net/SkySuperWL/article/details/52583579