MySQL innodb索引回表操作,最左匹配
簇集索引(主键索引):索引的叶子结点存的所有字段值,
非簇集索引(非主键索引): 索引的叶子结点存的是主键字段的值
回表操作:
例子:表table 有主键 a,索引b
select a,b,c from table where a=1 ,因为a是簇集索引有所有字段,不会回表查
select a,b,c from table where b=1,因为b是非簇集索引只有主键a和索引b,会回表查,步骤是拿a去a的簇集索引去找到c,最后a,b,c都有了
避免:select自己需要的字段,给需要的字段建立联合索引
最左匹配:
例子如索引(name,age)
那么
select * from emp where age =1 不会走索引
select * from emp where name='张三' 走索引
解决:建立索引(name,age) ,age
索引覆盖:
概括:只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。
常见的方法是:将被查询的字段,建立到联合索引里去。
索引下推:
例子:
如现在有个表table,有组合索引(name,age)
现在的sql:
select * from table where name like '张%' and age =20
在mysql5.6之前,执行过程是忽略age(最左匹配)使用name的索引,找到多个符合name条件的id,根据id一次次回表查数据
在mysql5.6之后,使用name索引同时,同时判断age=20,直接查出少量id回表查