MySQL优化手册之 —— ORDER BY 优化准则
- NOTE-A:排序字段需反复调试校验;
- NOTE-B:准则二中关于系统变量/参数调整,8+版本单独开篇说明。
准则一:极力避免采用filessort排序,保证通过有序索引扫描(using index)
- 避免对非索引字段排序(应保证覆盖索引);
- 确保 ORDER BY 的 CONDITION 中字段在同一索引中;
- 确保 ORDER BY 的 CONDITION 中字段顺序与复合索引创建时的顺序一致;
- 确保 ORDER BY 的排序标记一致(避免 ORDER BY A DESC, B ASC;) ;
- 避免 WHERE 的 CONDITION 与 ORDER BY 的 CONDITION 使用不同索引;
- 避免 WHERE 的 CONDITION 或 ORDER BY 的CONDITION 中使用包括函数表达式在内的各种表达式;
- 确保 WHERE 的 CONDITION 与 ORDER BY 的 CONDITION 满足最左前缀原则;
- 确保[左/右]连接查询时,ORDER BY 的 CONDITION 为[左/右]的字段;
- 确保多表联查时,ORDER BY 的 CODITION 字段为首张表的字段;
- 确保在
准则二:不可避免地filesort时,则应优化 filesort
- filesort排序算法简要
- 优化filesort
1) 适当提高 sort_buffer_size 和 max_length_for_sort_data 的系统变量;实际需要根据数据量进行实际测试。
2) 优化查询的字段,使其长度匹配 max_length_for_sort_data 参数的限制。
NOTE: MySQL 8+ 的方案