打卡(2020-04-27)
优化order by语句
mysql的两种排序方式
1.第一种就是通过有序索引顺序扫描直接返回数据,常见的是使用explain分析查询Extra显示Using index,这种情况不需要额外的排序,高效率。
2.通过返回数据进行排序,通常是使用explain分析查询语句使用Extra表示Filesort
- Filesort只是表示排序名字,至于是怎么排序是在内存中排序还是磁盘中排,如果sort_buffer_size不够就会在磁盘中排序
3.了解了排序的方式,清晰了优化目标:尽量减少额外的排序,通过索引直接返回有序数据
。
- where条件和order by 使用相同的索引,并且order by的顺序和索引顺序相同,并且order by 字段是升序或者降序。否则就会出现filesort.
Filesort的优化
我们优化Filesort时候,尽量减少Filesort出现,但是在有些某些情况下不能让Filesort消失,我们办法就是加快filesort操作
- 两次扫描算法(Two Passes)首先取出带排序字段的行指针信息,然后在sort buffer中排序,如果排序区sort buffer不够,就会在临时表中存储排序结果。第二次每行指针获取记录。
- 一次扫描 (single Pass) 一次取出所有的行和字段,在sort buffer中排序进行输出结果,这个比较快。
- 注意:我们需要设置
合理
的max_length_for_sort_data的值,加入设置过大就会导致cpu利用低io使用过高。sort_buffer_size是每一个线程独占。所以我们需要根据服务mysql设置合理的排序区。