导读:本期聚焦于小伙伴创作的《MySQL查询优化:如何将一个耗时10分钟的查询优化到秒级?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《MySQL查询优化:如何将一个耗时10分钟的查询优化到秒级?》有用,将其分享出去将是对创作者最好的鼓励。

MySQL查询耗时从10分钟降到秒级是数据库性能优化中常见的需求,这类优化需要结合查询场景、表结构、数据量等多维度分析,找到瓶颈后针对性调整即可实现性能跃升。

MySQL查询优化:如何将一个耗时10分钟的查询优化到秒级?

第一步:定位慢查询的核心问题

首先需要确认查询耗时的具体原因,避免盲目优化。可以通过开启MySQL慢查询日志,记录执行时间超过阈值的SQL,再结合EXPLAIN命令分析执行计划。

使用如下命令开启慢查询日志:

-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
-- 设置慢查询阈值,单位秒,这里设置为1秒
SET GLOBAL long_query_time = 1;
-- 查看慢查询日志文件路径
SHOW VARIABLES LIKE 'slow_query_log_file';

拿到慢查询SQL后,使用EXPLAIN分析执行计划,重点关注typekeyrowsExtra这几个字段:

  • type如果是ALL表示全表扫描,是性能差的典型表现
  • keyNULL说明没有使用索引
  • rows数值越大,说明扫描的行数越多,耗时越长
  • Extra出现Using filesortUsing temporary说明存在额外排序或临时表操作,也会拖慢查询

第二步:索引优化是核心手段

大部分分钟级慢查询都是因为缺少合适的索引导致全表扫描,需要根据查询条件创建联合索引,遵循最左前缀匹配原则。

假设存在如下用户订单表,数据量达到千万级,原查询SQL耗时10分钟:

SELECT order_id, user_id, order_amount, create_time
FROM user_order
WHERE user_id = 12345
  AND create_time >= '2024-01-01'
  AND create_time <= '2024-01-31'
  AND order_status = 2
ORDER BY create_time DESC
LIMIT 20;

原表没有针对查询条件的索引,执行计划显示typeALL,扫描全表千万行数据。根据查询条件,创建联合索引:

-- 创建联合索引,顺序遵循最左前缀:等值条件在前,范围条件在后
CREATE INDEX idx_user_status_time ON user_order(user_id, order_status, create_time);

索引创建后,再次执行EXPLAIN分析,type会变为rangekey显示使用了新创建的索引,扫描行数从千万级降到几十行,查询耗时直接降到几百毫秒。

第三步:优化SQL语句写法

部分查询即使有索引,写法不合理也会导致索引失效,常见问题及优化方式如下:

避免对索引字段做函数操作

如果查询条件中对索引字段使用函数,比如WHERE DATE(create_time) = '2024-01-01',会导致索引失效,全表扫描。优化为范围查询:

-- 优化前,索引失效
SELECT * FROM user_order WHERE DATE(create_time) = '2024-01-01';
-- 优化后,索引生效
SELECT * FROM user_order WHERE create_time >= '2024-01-01 00:00:00' AND create_time <= '2024-01-01 23:59:59';

减少不必要的字段查询

避免使用SELECT *,只查询需要的字段,减少数据返回量,同时如果查询字段都在索引中,还可以触发索引覆盖,不需要回表查询数据,进一步提升性能。

优化分页查询

深度分页比如LIMIT 100000, 20会扫描前10万行数据再取20行,耗时很长。可以改为基于上次查询的最后一条记录ID分页:

-- 优化前,深度分页慢
SELECT id, order_amount FROM user_order ORDER BY id LIMIT 100000, 20;
-- 优化后,基于上次最大ID查询
SELECT id, order_amount FROM user_order WHERE id > 100000 ORDER BY id LIMIT 20;

第四步:其他辅助优化手段

如果索引和SQL优化后仍有性能问题,可以考虑以下方式:

  • 对大表进行分区,按照时间或者业务维度拆分数据,查询时只扫描对应分区
  • 定期清理无用数据,减少表的总数据量
  • 如果是统计类查询,可以提前汇总数据到汇总表,查询时直接查汇总表
  • 调整MySQL配置参数,比如增大innodb_buffer_pool_size,让更多数据和索引缓存在内存中

通过以上步骤,原本耗时10分钟的查询基本都可以优化到秒级甚至毫秒级,实际优化时需要根据具体场景组合使用多种方法,持续优化迭代即可。

MySQL查询优化索引优化SQL调优慢查询修改时间:2026-07-24 10:57:23

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。