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查询的性能。在实际应用中,应根据具体业务需求选择最适合的排序方式,并通过优化查询逻辑和数据结构来减少资源消耗。

    上一篇:index_merge导致死锁案例分析
    下一篇:MySQL前缀索引上限案例分析

    发表评论

    最新留言

    关注你微信了!
    [***.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最新版Node.js下载安装及环境配置教程(非常详细)从零基础入门到精通,看完这一篇就够了 2023-01-24
    2023网络安全现状,一个(黑客)真实的收入 2023-01-24
    2024 年需要了解的顶级大数据工具(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
    2024 最新 Kali Linux 定制化魔改,完整版,添加常见60渗透工具,零基础入门到精通,收藏这篇就够了 2023-01-24
    2024大模型行业应用十大典范案例集(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
    00后才是内卷之王,被卷的头皮发麻.... 2023-01-24
    2024届秋招让我(985本硕)直接破防,感觉书读了这么久结果毫无意义,读书就只为了读书,我该怎么办? 2023-01-24
    2024年专业介绍||现代通信技术,从零基础到精通,收藏这篇就够了! 2023-01-24
    2024年为什么越来越多的人选择转行网络安全?零基础入门到精通,收藏这篇就够了 2023-01-24
    2024年从零学习AI和深度学习Transformer的路线图(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
    006从零开始学Python—自定义函数 2023-01-24