Mysql索引优化

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来追踪使用了哪种模式?

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值