1.联合索引的第一个字段是范围查询,一般不走索引
优化措施:
- 强制使用索引force index
- 使用覆盖索引
2.in或or在数据量大的情况下会走索引,数据量小的话全表扫描
3.like kk%一般情况下会走索引
覆盖索引中使用了索引下推。使用联合索引查询的时候,不仅仅只拿联合索引的第一个字段进行过滤,5.6之后,会把该SQL里面涉及的联合索引的字段都拿出来进行过滤,最后在回表查询,这样就减少了与数据库的的交互次数,减少了开销。用于只能二级索引。
Mysql如何选择合适的索引?
可以通过trace来查询:
set session optimizer_trace="enabled=on",end_markers_in_json=on; --开启trace
select * from employees where name > 'a' order by position;
SELECT * FROM information_schema.OPTIMIZER_TRACE;
set session optimizer_trace="enabled=off"; --关闭trace
可以查看表中trace字段的值来指导mysql使用了索引还是全表扫描
优化小总结:
MySQL有两种排序:1.filesort 2.index
index效率是高于filesort,orderby要想走index,需要满足联合索引最左原则。一条SQL中
1.where+orderby的字段要符合联合索引的字段顺序
2.orderby的字段要符合联合索引的字段顺序
3.能使用覆盖索引优化的尽量使用
4.groupby类似orderby,能用where过滤的就不要用having
5.尽量在索引上排序
filesort排序的方式:
- 单路排序:根据过滤条件把符合要求的数据(包括所有字段)都捞出来,放入sort_buffer中进行排序,然后返回结果给客户端
- 双路排序:根据过滤条件只把过滤的字段捞出来,放入sort_buffer中进行排序,然后根据这过滤字段的主键id去聚簇索引中回表查询所有数据(这才是所有字段),然后返回结果给客户端
存在即合理,不同的场景用不同的方式。动动脑袋就能分辨出来,理解,理解了才好记忆。
MySQL 通过比较系统变量 max_length_for_sort_data(默认1024字节) 的大小和需要查询的字段总大小来判断使用哪种排序模式。
- 如果 字段的总长度小于max_length_for_sort_data ,那么使用 单路排序模式;
- 如果 字段的总长度大于max_length_for_sort_data ,那么使用 双路排序模式。
也能通过trace来追踪使用了哪种模式?