68人参与 • 2026-05-10 • Mysql
在高并发、大数据量的业务场景中,数据库性能直接决定系统稳定性与用户体验,而慢 sql是导致数据库卡顿、响应超时、服务雪崩的核心元凶之一。慢 sql 优化并非临时 “救火”,而是贯穿开发、测试、运维全流程的系统性工作。本文从定义、识别、分析到多维度优化,形成一套完整可落地的慢 sql 优化方案,助力开发者从根源提升数据库性能。
慢 sql 即慢查询 sql,指执行时间超过数据库预设阈值(如 mysql 默认 10 秒,业务中通常设为 1 秒)、占用过多资源、执行效率低下的 sql 语句。阈值可通过数据库参数自定义,是衡量 sql 性能的基础标准。
慢 sql 的危害具有传导性,单个低效 sql 可能引发整个系统的性能故障,是后端开发必须重视的核心问题。
优化的前提是精准定位,只有快速找到慢 sql,才能针对性解决问题。
慢查询日志是数据库自动记录慢 sql 的核心机制,通过修改配置文件或动态参数开启:
# 开启慢查询日志 slow_query_log = 1 # 慢查询阈值(单位:秒,建议设为1) long_query_time = 1 # 慢查询日志文件路径 slow_query_log_file = /var/log/mysql/slow.log # 记录未使用索引的sql log_queries_not_using_indexes = 1
配置后重启 mysql,即可实时捕获执行超时、未命中索引的慢 sql。
原生慢查询日志可读性差,可借助工具高效分析:
慢 sql 的产生并非偶然,核心集中在索引、语句、设计三大维度:
select *,查询无关字段,增加 io 与网络传输;distinct/order by,增加计算成本;索引是慢 sql 优化最直接、最高效的手段,核心是减少扫描行数。
联合索引遵循最左匹配原则:索引(a,b,c),仅当查询条件包含a、a+b、a+b+c时命中索引,跳过a直接查b则索引失效。
%前缀;or连接条件中包含非索引字段;场景:用户表user查询where phone = ?,无索引导致全表扫描。
phone创建唯一索引,耗时降至毫秒级。场景:订单表查询where user_id = ? and create_time > ?,单字段索引效率低;
(user_id, create_time),命中覆盖索引,无需回表。索引优化有限,规范 sql 写法才能从根源避免慢查询。
只查询业务需要的字段,减少磁盘 io、网络传输与内存占用。
-- 不推荐 select * from user where id = 1; -- 推荐 select id,username,phone from user where id = 1;
子查询嵌套过深会产生临时表与文件排序,效率极低:
-- 低效子查询 select * from order where user_id in (select id from user where status = 1); -- 高效join select o.* from order o join user u on o.user_id = u.id where u.status = 1;
limit,大数据量分页优化为where id > ? limit 20;select count(*)全表统计,可缓存或使用统计表;distinct、group by的不必要使用。sql 与索引优化后,可通过内核参数与架构设计进一步提升性能。
innodb_buffer_pool_size:innodb 缓冲池,建议设为物理内存的 50%~70%,缓存热点数据;innodb_log_file_size:重做日志大小,提升写入性能;max_connections:调整最大连接数,避免连接耗尽;query_cache(mysql 8.0 已废弃),避免缓存失效开销。explain是分析 sql 执行路径的神器,可精准判断是否命中索引、扫描行数、是否全表扫描。
system > const > eq_ref > ref > range > index > all,all代表全表扫描,必须优化;null表示未命中索引;using filesort、using temporary为严重性能瓶颈,需优化。explain select * from order where user_id = 1001;
通过执行计划快速定位:未命中索引、全表扫描、文件排序等问题,针对性优化。
问题 sql:
select count(*),sum(price) from order where create_time between '2024-01-01' and '2024-12-31' and status = 1;
问题分析:
优化步骤:
idx_create_time_status(create_time,status,price)(覆盖索引);select count(id),sum(price) from order where create_time between '2024-01-01' and '2024-12-31' and status = 1;
优化效果:
explain查看执行计划,判断是索引、语句还是架构问题;explain审查所有 sql;慢 sql 优化是持续迭代的过程,只有将规范融入开发流程,才能从根源杜绝数据库性能隐患,保障系统高可用、高稳定运行。
到此这篇关于mysql的慢sql优化的实现的文章就介绍到这了,更多相关mysql 慢sql优化内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论