
MySQL如何对order by优化?
发布日期:2021-05-18 09:16:20
浏览次数:21
分类:精选文章
本文共 1661 字,大约阅读时间需要 5 分钟。
MySQL排序优化指南
在实际应用中,优化order by
排序性能至关重要。MySQL在处理排序查询时,会根据实际情况选择最优的排序算法。以下是几种常见的排序优化方法及其适用场景。
一、利用索引进行排序
B-tree索引的有序性是优化order by
查询的重要基础。以下是利用索引排序的关键点:
索引要求:
- 排序列必须是B-tree索引字段。
- 在多表关联查询中,排序列必须是驱动表字段。
优化示例:
- 单表排序:
select * from sbtest4 t4 order by t4.k desc limit 5;
当
k
列是B-tree索引时,MySQL会优先利用索引进行排序。 - 多表关联:
select * from sbtest4 t4 join sbtest3 t3 on t4.id=t3.id order by t3.k limit 5;
在驱动表
sbtest3
中,排序列k
需要是B-tree索引。
复合索引的最佳实践:
- 当复合索引的最左前缀是过滤条件时,
order by
字段配合常量过滤可以高效利用复合索引。 - 避免以下情况:
- 排序字段涉及多个未覆盖的索引。
- 排序字段包含升序或降序操作。
- 排序字段引用了不在索引中的字段。
无法利用索引的情况:
- 排序基准过多,无法满足索引覆盖条件。
- 多个
UNION
子查询需要排序。 - 需要随机访问结果记录。
二、仅对驱动表排序
在多表关联查询中,当排序字段为驱动表字段且无法有效利用索引时,MySQL会选择以下方式:
特点:
- 排序字段为驱动表字段,且该字段无有效索引。
- 被驱动表关联字段需要通过索引进行过滤。
优化示例:
select * from sbtest4 t4 join sbtest3 t3 on t4.id=t3.id where t3.k < 1000 order by t3.c limit 5;
在执行计划中可以看到Using filesort
,表明使用了文件排序。
优化建议:
- 优化
where
过滤条件,减少驱动表扫描和排序的记录数。 - 尽量避免使用
select *
,而是只选择需要的字段。
三、使用临时表进行排序
在多表关联查询中,当排序字段为被驱动表字段时,MySQL会使用临时表进行排序:
特点:
- 排序字段为被驱动表字段。
- MySQL需要获取多表关联结果后才能进行排序。
优化示例:
select * from sbtest4 t4 join sbtest3 t3 on t4.id=t3.id where t3.k < 1000 order by t4.k limit 5;
执行计划中可以看到Using temporary; Using filesort
,表明使用了临时表和文件排序。
优化建议:
- 尽量避免使用
order by
字段作为被驱动表字段。 - 优化
where
过滤条件,减少需要排序的记录数。 - 减少
select *
的使用,避免磁盘临时表的读取开销。
四、三种排序方式对比
排序处理方式 | 执行计划extra列信息 | 排序性能比较 |
---|---|---|
利用索引排序 | 无 | 高 |
仅对驱动表排序 | Using filesort | 中 |
使用临时表排序 | Using temporary; Using filesort | 低 |
5. 三种排序扫描算法
两次扫描算法:
- 适用于包含大字段(如BLOB或TEXT)或需要排序记录较多的情况。
- 优点:减少随机IO读取开销。
- 缺点:需要两次对数据进行扫描。
一次扫描算法:
- 适用于排序记录较少且不超过
max_length_for_sort_data
的情况。 - 优点:减少IO读取次数。
- 缺点:不适用于包含大字段的查询。
优先队列排序:
- 适用于
order by ... limit M, N
的场景。 - 优点:减少sort_buffer_size的使用需求。
- 缺点:需要扫描所有记录。
通过合理选择排序算法和优化索引结构,可以显著提升order by
查询的性能。在实际应用中,应根据具体业务需求选择最适合的排序方式,并通过优化查询逻辑和数据结构来减少资源消耗。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月13日 21时18分02秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
10款最佳免费WiFi黑客工具(附传送门)零基础入门到精通,收藏这一篇就够了
2023-01-24
15个Python数据分析实用技巧(非常详细)零基础入门到精通,收藏这一篇就够了
2023-01-24
15个备受欢迎的嵌入式GUI库,从零基础到精通,收藏这篇就够了!
2023-01-24
15个程序员常逛的宝藏网站!!从零基础到精通,收藏这篇就够了!
2023-01-24
1分钟学会在Linux下模拟网络延迟
2023-01-24
200款免费的AI工具汇总
2023-01-24
2023年失业的你明白了什么道理?
2023-01-24
00后整顿职场?公司测试岗却新来了个00后卷王,3个月薪资干到20K...
2023-01-24
2023应届毕业生找不到工作很焦虑怎么办?
2023-01-24
2023网络安全现状,一个(黑客)真实的收入
2023-01-24
2024 年需要了解的顶级大数据工具(非常详细)零基础入门到精通,收藏这一篇就够了
2023-01-24
2024大模型行业应用十大典范案例集(非常详细)零基础入门到精通,收藏这一篇就够了
2023-01-24
00后才是内卷之王,被卷的头皮发麻....
2023-01-24
2024年专业介绍||现代通信技术,从零基础到精通,收藏这篇就够了!
2023-01-24
2024年为什么越来越多的人选择转行网络安全?零基础入门到精通,收藏这篇就够了
2023-01-24
006从零开始学Python—自定义函数
2023-01-24