news 2026/5/16 23:49:04

MySQL ORDER BY 原理与优化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL ORDER BY 原理与优化

ORDER BY 是 SQL 里最常见的子句之一,但用不好就是性能杀手。这篇说说 ORDER BY 的原理和优化方法。

ORDER BY 的执行原理

-- 简单 ORDER BYSELECT*FROMorderORDERBYcreated_atDESC;

MySQL 处理 ORDER BY 的过程:

  1. 全表扫描:读取所有数据
    1. 排序:内存排序 or 外部排序
    1. 返回结果:排序后的数据
      如果数据量小,MySQL 用内存排序(Filesort);如果数据量大,就要用磁盘排序,性能很差。

Filesort:MySQL 的排序算法

MySQL 用 Filesort 做排序,虽然名字带「file」,但不一定用磁盘——内存够用就在内存排。

两种模式

模式1:全字段排序(ROWID Sort)

-- 只返回排序字段 + 主键EXPLAINSELECTorder_id,created_atFROMorderORDERBYcreated_at;
排序时:order_id, created_at(2个字段) 排序后:按 created_at 排,用主键回表取完整数据

模式2:索引覆盖排序(Index Sort)

-- 如果 ORDER BY 字段有索引,直接用索引CREATEINDEXidx_created_atONorder(created_at);SELECT*FROMorderORDERBYcreated_at;

直接读索引树,有序,不用再排。

什么情况下用索引排序?

-- ✅ 能用索引排序ORDERBYcreated_at-- 有索引ORDERBYuser_id,created_at-- 符合最左前缀WHEREuser_id=1ORDERBYcreated_at-- 索引覆盖-- ❌ 不能用索引排序ORDERBYcreated_atDESC,idASC-- DESC/ASC 混用ORDERBYcreated_at,updated_at-- 没有复合索引 (created_at, updated_at)WHEREcreated_at>'2024-01-01'ORDERBYcreated_at-- 范围查询后面的字段

Using filesort:什么时候出现?

EXPLAINSELECT*FROMorderORDERBYcreated_at;

Extra 列出现Using filesort,说明要额外排序。

常见原因

  1. 没有 ORDER BY 的索引
    1. ORDER BY 用了函数
    1. 混用 ASC/DESC
    1. 排序字段不在同一个索引里

优化 ORDER BY

1. 覆盖索引

-- 只需要排序字段 + 主键,建联合索引CREATEINDEXidx_user_id_createdONorder(user_id,created_at);-- 排序语句SELECTid,created_atFROMorderWHEREuser_id=1ORDERBYcreated_atDESC;

2. 分页优化

-- 深分页排序很慢SELECT*FROMorderORDERBYcreated_atDESCLIMIT1000000,10;-- 优化:用主键范围SELECT*FROMorderWHEREid<1000000ORDERBYidDESCLIMIT10;

3. 减少排序数据量

-- ❌ 全表排序SELECT*FROMorderORDERBYcreated_atDESC;-- ✅ 加 WHERE 条件,减少排序范围SELECT*FROMorderWHEREstatus='completed'ORDERBYcreated_atDESC;

4. 避免在 ORDER BY 里用函数

-- ❌ 索引失效ORDERBYYEAR(created_at)-- ✅ 改用范围查询WHEREcreated_at>='2024-01-01'ANDcreated_at<'2025-01-01'ORDERBYcreated_at

实战:EXPLAIN 看排序

EXPLAINSELECT*FROMorderORDERBYcreated_atDESC;-- type: ALL(全表扫描)-- key: NULL(没走索引)-- Extra: Using filesort(需要排序)

优化后

CREATEINDEXidx_created_atONorder(created_atDESC);EXPLAINSELECT*FROMorderORDERBYcreated_atDESC;-- type: index(扫索引树)-- key: idx_created_at(走了索引)-- Extra: Using index(索引覆盖,不需要回表!)

小结

优化方法效果
覆盖索引⭐⭐⭐⭐⭐ 最优
加 WHERE 条件⭐⭐⭐⭐
避免函数⭐⭐⭐
避免混用 ASC/DESC⭐⭐⭐
分页用主键范围⭐⭐⭐⭐

ORDER BY 优化的核心:让 ORDER BY 字段有索引让查询走索引而不是 filesort


相关阅读:

  • [MySQL 索引底层 B+ 树原理]
    • [MySQL 索引失效的七种情况]
    • [MySQL 分页查询优化]
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 23:38:04

芯片设计中的静态时序分析:原理、应用与工程实践

1. 静态时序分析&#xff1a;芯片设计的“守门人”在数字芯片设计的漫长流程里&#xff0c;有一个环节如同精密仪表的校准师&#xff0c;它不关心电路具体在做什么功能&#xff0c;只专注于一个核心问题&#xff1a;信号能否在规定的时间窗口内&#xff0c;稳定、可靠地从一个点…

作者头像 李华
网站建设 2026/5/16 23:36:22

使用taotoken聚合api后模型响应延迟的实际体感观察

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用taotoken聚合api后模型响应延迟的实际体感观察 作为一名日常需要调用多种大模型API的开发者&#xff0c;将多个供应商的API接入…

作者头像 李华
网站建设 2026/5/16 23:28:46

Pyodide深度解析:在浏览器中构建Python运行时环境的技术实践

Pyodide深度解析&#xff1a;在浏览器中构建Python运行时环境的技术实践 【免费下载链接】pyodide Pyodide is a Python distribution for the browser and Node.js based on WebAssembly 项目地址: https://gitcode.com/gh_mirrors/py/pyodide Pyodide作为基于WebAssem…

作者头像 李华
网站建设 2026/5/16 23:27:50

零焊接LED珠宝项链DIY:从电路原理到艺术布局的完整指南

1. 项目概述&#xff1a;当珠宝遇见光几年前&#xff0c;我还在为一场主题派对寻找一件能“镇住场子”的配饰&#xff0c;既要足够闪亮&#xff0c;又不能显得廉价。逛遍了市面上的成品&#xff0c;要么是千篇一律的塑料感&#xff0c;要么是价格令人咋舌的高级定制。就在那时&…

作者头像 李华