MySQL--索引的优化--ORDER BY

embedded/2025/2/27 13:50:24/

在MySQL中,ORDER BY语句的性能优化是一个重要的课题,尤其是在处理大数据集时,如果ORDER BY没有正确使用索引,可能会导致全表扫描或文件排序(Using filesort),从而严重影响查询性能。以下是一些详细的优化策略和示例。

一、ORDER BY使用索引的条件

MySQL在以下情况下可以使用索引来优化ORDER BY

  • 索引列顺序匹配:ORDER BY的列顺序必须与索引的列顺序一致

  • 单列或多列索引:ORDER BY可以使用单列索引或多列索引

  • ASC/DESC一致:ORDER BY的排序方向(ASC或DESC)必须与索引的排序方向一致

二、单列索引优化ORDER BY

如果ORDER BY只涉及单列,可以为该列创建索引

示例:

-- 创建表
CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(255) NOT NULL,age INT NOT NULL
);
​
-- 插入数据
INSERT INTO users (username, age) VALUES
('john_doe', 25),
('jane_doe', 30),
('alice', 22),
('bob', 28);
​
-- 创建索引
CREATE INDEX idx_age ON users(age);
​
-- 使用索引优化ORDER BY
EXPLAIN SELECT * FROM users ORDER BY age;
  • 执行计划分析

    • EXPLAIN结果中的type列会显示index,表明使用了索引扫描。

    • Extra列会显示Using index,表明查询使用了覆盖索引。

三、多列索引优化ORDER BY

如果ORDER BY涉及多列,可以为这些列创建复合索引

示例:

-- 创建复合索引
CREATE INDEX idx_username_age ON users(username, age);
​
-- 使用复合索引优化ORDER BY
EXPLAIN SELECT * FROM users ORDER BY username, age;
  • 执行计划分析

    • EXPLAIN结果中的type列会显示index,表明使用了索引扫描。

    • Extra列会显示Using index,表明查询使用了覆盖索引。

四、ORDER BY与WHERE结合

如果查询中同时包含WHERE和ORDER BY,MySQL可能会使用索引来优化查询

示例:

-- 创建索引
CREATE INDEX idx_age ON users(age);
​
-- 使用索引优化WHERE和ORDER BY
EXPLAIN SELECT * FROM users WHERE age > 25 ORDER BY age;
  • 执行计划分析

    • EXPLAIN结果中的type列会显示range,表明使用了索引范围扫描。

    • Extra列会显示Using index condition,表明查询使用了索引条件。

五、ORDER BY与LIMIT结合

如果查询中包含LIMIT,MySQL可以更高效地使用索引

示例:

-- 使用索引优化ORDER BY和LIMIT
EXPLAIN SELECT * FROM users ORDER BY age LIMIT 10;
  • 执行计划分析

    • EXPLAIN结果中的type列会显示index,表明使用了索引扫描。

    • Extra列会显示Using index,表明查询使用了覆盖索引。

六、 ORDER BY与覆盖索引

如果查询只需要返回索引列,可以使用覆盖索引(Covering Index)来避免回表操作。

示例:

-- 创建覆盖索引
CREATE INDEX idx_age_covering ON users(age, username);
​
-- 使用覆盖索引优化ORDER BY
EXPLAIN SELECT age, username FROM users ORDER BY age;
  • 执行计划分析

    • EXPLAIN结果中的type列会显示index,表明使用了索引扫描。

    • Extra列会显示Using index,表明查询使用了覆盖索引。

七、ORDER与文件排序(Using filesort)

如果ORDER BY无法使用索引,MySQL会使用文件排序(Using filesort),这会导致性能下降

示例:

-- 未使用索引的ORDER BY
EXPLAIN SELECT * FROM users ORDER BY username DESC;

八、优化文件排序

如果无法避免文件排序,可以通过以下方法优化:

  • 增加sort_buffer_size:增大排序缓冲区的大小

  • 减少排序数据量:通过WHERE条件或LIMIT减少需要排序的数据量

-- 增加sort_buffer_size
SET SESSION sort_buffer_size = 4 * 1024 * 1024;  -- 设置为4MB
​
-- 减少排序数据量
EXPLAIN SELECT * FROM users WHERE age > 25 ORDER BY username LIMIT 10;

九、ORDER BY与联合索引的顺序

如果ORDER BY的列顺序与联合索引的列顺序不一致,MySQL可能无法使用索引

示例:

-- 创建联合索引
CREATE INDEX idx_age_username ON users(age, username);
​
-- ORDER BY顺序与索引顺序不一致
EXPLAIN SELECT * FROM users ORDER BY username, age;
  • 执行计划分析

    • EXPLAIN结果中的type列会显示ALL,表明进行了全表扫描。

    • Extra列会显示Using filesort,表明使用了文件排序。

十、ORDER BY与DESC排序

如果ORDER BY使用DESC排序,MySQL需要索引的列也是DESC排序

示例:

-- 创建DESC排序的索引
CREATE INDEX idx_age_desc ON users(age DESC);
​
-- 使用DESC排序的索引
EXPLAIN SELECT * FROM users ORDER BY age DESC;

(索引建立的时候是age desc 索引排序了)

  • 执行计划分析

    • EXPLAIN结果中的type列会显示index,表明使用了索引扫描。

    • Extra列会显示Using index,表明查询使用了覆盖索引。

十一、分区表优化ORDER BY

如果数据量非常大,可以使用分区表(Partitioning)来减少每次查询需要排序的数据量

示例:

-- 创建分区表
CREATE TABLE users_partitioned (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(255) NOT NULL,age INT NOT NULL
) PARTITION BY RANGE (age) (PARTITION p0 VALUES LESS THAN (20),PARTITION p1 VALUES LESS THAN (30),PARTITION p2 VALUES LESS THAN (40),PARTITION p3 VALUES LESS THAN MAXVALUE
);
​
-- 插入数据
INSERT INTO users_partitioned (username, age) 
SELECT username, age FROM users;
​
-- 使用分区表优化ORDER BY
EXPLAIN SELECT * FROM users_partitioned ORDER BY age;
  • 执行计划分析

    • EXPLAIN结果中的partitions列会显示查询涉及的分区,表明查询只扫描了部分数据。


http://www.ppmy.cn/embedded/167542.html

相关文章

2025系统架构师(一考就过):案例之三:架构风格总结

软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式,按照软件架构风格,物联网系统属于( )软件架构风格。 A:层次型 B:事件系统 C:数据线 D:C2 答案:A 解析: 物联网分为多个层次&#xff0…

火语言RPA--Word打开文档

【组件功能】:打开已有或者新建Word文档,并实例化初始化操作 配置预览 配置说明 打开方式 打开已存在Word文档或者新建Word文档。 Word文件路径 支持T或# 设置打开或者新建Word文件的文件路径。 对象修改操作保存模式 word文件被改变时每一步自动…

2025.2.26总结

工作 今日终于完成了Core Common的遗留问题的闭环,整个项目版本下来,还是挺磨练人的,如今已经不记得熬了多少个夜,不记得有多少个焦虑的周末。收获也是挺大的,最主要的还是工作方法的总结。 学习 ilearnming平台学习…

《论软件维护方法及其应用》审题技巧 - 系统架构设计师

软件维护方法及其应用论文写作框架 一、考点概述 软件维护作为软件工程的重要组成部分,是指在软件产品交付使用后,为了应对错误修正、环境变化、功能增强以及预防潜在问题而进行的一系列活动。这一考点涵盖了软件维护的基本概念、分类、重要性以及可维…

【学习笔记16】Java中常见的Exception(异常)

IllegalArgumentException 是Java中最常见的运行时异常之一,通常在向方法传递非法或不适当的参数时抛出。 如何解决Java中的IllegalArgumentException异常

伪404兼容huawei生效显示404

根据上述思考,以下是详细的中文分步说明: --- **步骤 1:获取目标设备的User-Agent信息** 首先,我们需要收集目标设备的User-Agent字符串,包括: 1. **iPhone设备的User-Agent**: Mozi…

视频推拉流EasyDSS直播点播平台授权激活码无效,报错400的原因是什么?

在当今数字化浪潮中,视频推拉流 EasyDSS 视频直播点播平台宛如一颗璀璨的明珠,汇聚了视频直播、点播、转码、精细管理、录像、高效检索以及时移回看等一系列强大功能于一身,全方位构建起音视频服务生态。它既能助力音视频采集,精准…

【学习方法】学习软件专业课程的思考方式

学习软件专业课程的思考方式 在学习软件专业课程时,我们往往会遇到一些看似简单但实际上却非常复杂的概念和理论。这种时候,我们可能会觉得书本很厚,难以理解。然而,这种看似简单的想法并不一定就是错误的,因为它激发…