1、最左前缀原则
如果使用联合索引,需要遵守最左前缀原则,必须按联合索引的字段顺序查询列,某个列没有用到则会导致后面的列都无法用到索引
explain select *from bus_user where grand_=1 and class_=11 and num_=111
explain select *from bus_user where num_=111
2、不在索引列上做任何操作(计算、函数、转换类型)
了解索引结构的就能清楚的知道,索引树存的是原始值,计算后索引数无法识别也无法保证有序
explain select * from bus_user where CONCAT('test',name)='testaaa'
3、尽量使用覆盖索引
避免使用select * ,如果仅返回二级索引包含的字段,可以避免回表,提高效率
explain select name from bus_user where name = '123'
explain select * from bus_user where name = '123'
4、like一通配符开头会导致索引失效变成全表扫描
explain select * from bus_user where name like '%123';
5、避免使用大范围条件
mysql在处理is null,not null,!=,not in ,not exists的时候无法使用索引,会导致全表扫描。在处理<,>,in,between这些范围查询时,内部优化器会根据检索的比例,表数据的大小等多个因素评估是否使用索引
explain select * from bus_user where name != '123';
6、范围查询优化
大范围查询会因为mysql优化器的对检索比例和表数据量的大小将索引失效,可以将一个大范围分为几个小范围进行查询,就可能是索引生效
#一个大范围可能会索引失效
explain select * from bus_user where age >=1 and age <=2000;
#拆成两个小范围
explain select * from bus_userwhere age >=1 and age <=1000;
explain select * from bus_userwhere age >=1000 and age <=2000;