覆盖索引
对于概念可以举一个例子
假设一条语句执行的是
select ID form T
where k between 3 and 5
假设k是索引,因为Innodb的的辅助索引是只存主键值(ID)的,如果查询别的数据,就需要根据k索引树找到对应数据的ID值,然后再根据ID值去主键索引中查找具体要查找的数据,这个过程也叫做回表
但是我们这里只是要查询ID,在辅助索引上就可以直接获得,而不用进行回表,这种“覆盖了”我们查询需求,我们称之为覆盖索引
最左前缀原则
最左匹配原则是非常重要的原则
- mysql会一直向右匹配直到遇到
范围查询
(<,>,between,like)就停止匹配,比如
select * form table
where a = 3 and b = 4 and c > 5 and d = 6
d是用不到索引的
- =和in可以乱序,比如
select * form table
where a = 3 and b = 4 and c = 5
建立(a,b,c)索引可以任意顺序,mysql的查询优化器可以帮助你优化成索引可以识别的形式
- 假设一个联合索引(a,b)那么这个索引是先按照a排序,然后再按照b排序的,也就是说
select * form table
where a=5
可以用到联合索引,而
select * form table
where b=5
则不能用到索引,因为b相对于a是顺序的,而自己是乱序的
参考文章
覆盖索引&&最左前缀原则&&索引下推
索引6:联合索引的最左匹配原则