这个涉及到MySQL本身的查询优化器策略,当一个表有多条索引可走时,mysql根据查询语句的成本来选择走哪条索引;
有人说where查询是按照从左到右的顺序,所以筛选力度大的条件尽量放在前面。网上百度过,确实有这种说法,但我亲自测试过,MySQL执行优化器会对其进行优化,当不考虑索引时,where条件顺序对效率没有影响,真正有影响的是是否用到了索引!
五、联合索引本质
当创建**(a, b, c)联合索引时,相当于创建了(a)单列索引,(a, b)联合索引以及(a, b, c)联合索引,想要索引生效的话,只能使用者三种组合;当然,我们上面测试过,a, c组合也可以,但实际上只用到了a的索引,c并没有用到。
六、索引失效
1、like子查询,%放前面;
2、非空判断 is not null;or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效;
3、or语句(前后都有索引才行,SQL优化要避免写or语句);
4、数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。
七、其它知识点
1、需要加索引的字段,要在where条件中
2、数据量少的字段不需要加索引,因为建索引有一定开销,如果数据量小则没有必要建索引,速