MySQL之优化order by和group by

目录

OrderBy~~~

优化Order By的前提

OrderBy子句尽量不要产生FileSort

如果OrderBy子句不可避免产生了FileSort的优化

总结

GroupBy~~~


 

OrderBy~~~

优化Order By的前提

 

首先我们要做的肯定是把OrderBy的字段建立成索引~~~

 

 

OrderBy子句尽量不要产生FileSort

 

Order By尽量使用index方式而不要使用filesort方式排序。index方式是指MySQL扫描索引本身完成排序,效率比filesort高。

关于filesorthttps://blog.csdn.net/Delicious_Life/article/details/105599062

当Order By满足两种情况时,会使用Index方式排序

  • Order By语句使用了索引遵循最佳左前缀法则
  • 使用where字句与Order By字句的条件列组合满足索引的最佳左前缀法则

 

 

如果OrderBy子句不可避免产生了FileSort的优化

 

 优化方法有两种,第一种已过时

  • 双路排序(mysql4.1之后过时)。原理是从磁盘取排序字段,在buffer进行排序,再从磁盘取出其他字段
  • 单路排序(目前mysql正在使用)。原理是从磁盘取查询需要的所有列,按照orderby在buffer中对其进行排序,然后扫描排序后的列进行输出。即把每一行都保存在内存中

 

单路排序存在的问题

由于单路排序会取出所有字段放在sort_buffer中,如果sort_buffer容量不够,就会导致每次只能取一部分数据放入sort_buffer中,本想省一次IO操作,但结果却导致了大量的IO操作。

 

解决策略

告诉运维,增大sort_buffer_size参数或者增大max_length_for_sort_data参数

 

 

总结

 

 

 

GroupBy~~~

  • group by的实质是先排序后进行分组,依据最佳左前缀原则建立索引~
  • 当无法使用索引列时,增大max_length_for_sort_data或sort_buffer_size参数
  • where条件高于having条件,能写在where中的条件不要写having
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值