思考题:
以下测验均在mysql8.0.29版本中:
#符合idx_abc索引的顺序条件,可以通过a,b进行条件筛选,但是需要回表
select * from t_abc where a = 10 and b = 10;
#符合idx_abc索引的最左匹配原则,c=10未能使用索引匹配,但可以使用索引条件下推,过滤一些索引行
select * from t_abc where a = 10 and c = 10;
#符合idx_abc索引最左匹配,但只能利用a字段过滤,需要回表,再判断d的值,若改成or则不走索引
select * from t_abc where a = 10 and d = 10;
上述三条语句全部走索引,区别在于能利用索引提升的速度不同;
#无法利用索引有序性消除排序,因为字段顺序不连续(Using filesort)
select * from t_abc where a = 10 order by a,c;
#无需额外排序
select * from t_abc where a = 10 order by b,c;
#完美匹配idx_abc,走覆盖索引
select id, a, b, c from t_abc where a = 10;
上述两条sql语句区别在于能否通过索引原有的顺序而消除排序;
#因为不符合最左匹配原则,应该不走二级索引,但是由于所需字段均在idx_abc中,mysql认为走索引的扫描成本会更低,所以走了索引,扫描行数和下面的全表扫描的行数是一致的,走了覆盖索引(Using index)
select id, a, b, c from t_abc where b = 10;
#和select * 无异,因为b上面建索引且不符合最左匹配原则,走全表扫描
select id, a, b, c, d from t_abc where b = 10;
上述三条sql区别在于是否可以利用覆盖索引,根据语句的内容选择扫描成本低的方案