目录
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