最左原则,因为如果没有第一个数值,比较不出大小就知道往二叉树的哪条线走
特殊的bcd为复合索引
select c from t;它是走索引的,因为它的搜索直接走的叶子节点,不需要从二叉树上走
范围搜索导致索引失效–回表
若主键是1 2 3 4 5 6 7 8
select * from t where a>1,①走索引二叉树②找到主键1然后回表,还不如直接全表扫描,所以它不会走索引
select * from t where a>7,这时走索引数效率更高,它是会走索引的
select a from t where a>1,一定是可以走索引的,因为a就在索引里,不需要回表,这时候范围搜索是生效的
覆盖索引的底层原理–回表
a是主键,bcd是复合索引,表中主键是1 2 3 4 5 6 7 8
select * from t where b>1,不走索引,因为要走索引还是要回表的,性能不如全表扫描
select b,c,d from t where b>1,走索引,因为不需要回表,数据就在索引里
select a,b,c,d from t where b>1,走索引,因为不需要回表,数据就在索引里
select a,b,c,d,e from t where b>1,不走索引,因为要查e数据,需要回表
所以走不走索引,需要考虑性能和需不需要索引
order by为什么为导致索引失败
select * from t order by b,c,d
若走索引,不需要排序,回表多次
全表扫描,额外排序(在内存中,很快),不需要回表
当然
select b from t order by b,c,d一定走索引,因为不要回表