MySQL优化
2025年4月23日大约 2 分钟
MySQL优化
排序
排序算法
- 快速排序:MySQL 5.7.8 之前,默认的排序算法是快速排序。
- 归并排序:MySQL 5.7.8 之后,默认的排序算法是归并排序。
排序原理
MySQL 在处理排序时有两种主要方式:
通过explain可以进行分析
- Using Index:如果排序字段有索引,MySQL 会直接利用索引完成排序。
- Using Filesort:如果没有合适的索引,MySQL 会将数据加载到内存或磁盘中进行排序。
Filesort:
排序操作可能会占用大量内存。如果数据量过大,MySQL 可能会将排序过程转移到磁盘上,这会显著降低性能。可以通过sort_buffer_size
、max_sort_length
和max_length_for_sort_data
参数来进行调整。
Filesort-内存排序:
当排序数据量在sort_buffer_size
内时内,MySQL 会选择将所有需要的数据(包括排序字段和返回字段)加载到内存中进行排序。
双路排序:
当排序字段和返回字段的总长度小于max_length_for_sort_data
时,MySQL 会选择使用双路排序。双路排序只会把主键和需要排序的字段放到sort_buffer中进行排序,然后再通过主键回到原表中查询需要的字段。双路排序会减少内存的使用,但需要额外的CPU计算。
单路排序:
将所有需要查询的字段都放到sort_buffer中进行排序。
Filesort-临时文件排序:
查询数据超过sort_buffer_size
时,MySQL 会将排序过程转移到磁盘上,一般利用归并排序,简单理解:将数据分成很多分组,然后分别对每个分组进行排序,最后再合并排序。
注意事项
- 索引优化:多字段排序时,索引的列顺序要和排序的列顺序保持一致。即:在复合索引中,字段的排序方向会影响索引的使用(DESC、ASC)。
- 索引设置:某些字段值分布不均匀的话,索引效率也很低。
- 排序字段避免函数或者复杂计算,可能会导致索引失效。
- 尽量通过where条件、分页查询来过滤数据量,也可以考虑使用分区表来减少数据量。