索引实战总结
索引使用原则
- 最左前缀原则
- 不在索引列做任何操作,统计,计算等操作会使索引失效,从而全表扫描
- 进行范围查询时,命中索引第一个列时,该列右面的索引列将无法使用,因为右面数据将是无序的
- 尽量使用覆盖索引
- MySQL中使用不等于时,容易造成全表扫描
- is null , is not null一般情况下也是不走索引的
- like查询以通配符开头回导致全表扫描
- 字符串查询不加单引号会因为类型不一致导致不走索引
- 少用in or 容易不走索引
索引下推
对于联合索引,如果在查询时使用了like等方式,由于后面几个索引都是无序的所以只走了第一个索引,在MySQL5.6以前版本回进行回表查询,然后根据另外的条件进行查询;
在MySQL5.6以后引入了索引下推机制,在回表之前先使用其他条件筛选一遍,将结果进行回表查询,从而减少回表次数。
using filesort排序原理
- 出现using filesort原因:排序字段未命中索引项,使用普通字段进行排序
- 两种排序算法
- 单路排序:一次性取出所有满足查询条件的所有数据,放到sort buffer里面进行排序。
- 双路排序:又叫回表排序,首先取出所有满足查询条件的行对应的主键id以及排序字段,放入到sort buffer中进行排序;排序完成后根据id进行回表查询所有字段。
- 选择原理
- 原理:MySQL中有一个max_length_for_sort_data参数,默认值是1kb,当需要查询的字段总大小小于该值时使用单路排序,大于该值时使用双路排序