如何使用MySQL快速定位慢SQL问题?企业级开发中常见业务场景中实际发生的例子。(一)

devtools/2025/3/29 7:50:52/

在企业级开发中如何用MySQL快速定位慢SQL问题?

开启慢查询日志、设置慢查询时间限制等基础操作,这些是定位慢SQL的关键步骤。使用EXPLAIN分析SQL执行计划,以及常见的导致SQL变慢的原因,比如索引失效、多表连接等。比如一个购物平台的订单查询业务中,想定位慢查询的问题。按照定位慢SQL的一般流程,先开启慢查询日志,设置合适的阈值,接着通过日志找到具体的慢SQL语句。在找到慢SQL后,使用EXPLAIN来分析它的执行计划,重点关注type、possible_keys、key、rows、extra这些指标,判断是否存在索引未使用、全表扫描等问题。同时,结合业务场景,考虑是否还有其他因素导致SQL变慢,比如数据量过大、查询字段过多等。
最后,针对分析出的问题,给出相应的优化建议,像添加索引、优化查询语句、分库分表等,可以通过这个思路一步步定位和解决慢SQL问题。

下面,我们举几个实际企业级开发中经常遇到的慢查询的例子,展开来详细分析并给出合理的慢查询优化建议。希望通过这两个例子,将慢查询的分析排查以及优化的过程做一个详细的分析,让大家都能有一个清晰的理解,方便以后大家在企业级开发中遇到类似问题能够游刃有余。

———————(●'◡'●)—————————华丽的分割线—————————————————

示例一

业务场景

某电商平台在促销活动期间,用户查询订单详情的接口响应时间明显变慢,影响用户体验。经过初步排查,怀疑是数据库中的某些SQL查询出现了性能问题。

定位慢SQL的步骤

  1. 开启慢查询日志 首先,确认MySQL是否开启了慢查询日志。在数据库服务器上执行以下命令:(sql)

    sql">SHOW VARIABLES LIKE '%slow%';

    如果slow_query_log的值为OFF,则需要开启它,并设置慢查询的时间阈值,如将超过1s的查询视为慢查询:(sql)

    sql">SET GLOBAL slow_query_log = ON;
    SET GLOBAL long_query_time = 1;

    同时,可以查看慢查询日志文件的路径

    sql">SHOW VARIABLES LIKE 'slow_query_log_file';

    这样,所有执行时间超过1s的SQL语句都会被记录到慢查询日志

  2. 分析慢查询日志 使用MySQL自带的工具sql>mysqldumpslow来分析慢查询日志,找出执行时间最长或执行次数最多的慢SQL语句。例如:(bash)

    sql>mysqldumpslow -s t -t 5 /path/to/slow-query.log

    这条命令会按照查询时间排序,显示前5条最慢的SQL语句

3. 使用EXPLAIN分析SQL执行计划 对于找到的慢SQL语句,使用EXPLAIN命令来查看其执行计划。例如,假设慢查询日志中有一条查询订单详情的SQL:

sql">SELECT * FROM orders WHERE user_id = 12345 AND order_status = 'PENDING';

 在数据库中执行:

sql">EXPLAIN SELECT * FROM orders WHERE user_id = 12345 AND order_status = 'PENDING';

通过查看EXPLAIN的输出,重点关注以下指标

  • type:查询类型,值越靠前(如constref)表示性能越好,ALL表示全表扫描,性能最差

  • possible_keyskey:显示可能使用的索引和实际使用的索引,若keyNULL,说明没有使用索引。

  • rows:查询需要扫描的行数,数值越大表示性能越差。

  • Extra:包含额外信息,如Using filesort表示需要额外排序操作,Using temporary表示需要创建临时表。

 4.结合业务分析原因 

在本例中,经过EXPLAIN分析发现,上述SQL语句的typeALLrows高达数十万,且Extra中有Using filesort。结合业务场景,促销活动期间订单量激增,表中数据量大幅增长,而查询条件中的user_idorder_status未建立联合索引,导致查询时需要全表扫描并进行文件排序,从而性能下降。

 5.制定优化方案 可以采取以下优化措施:

  • 添加索引:为orders表的user_idorder_status字段创建联合索引,以加快查询速度:

    sql">ALTER TABLE orders ADD INDEX idx_user_status (user_id, order_status);
  • 优化查询语句避免使用SELECT *,只查询需要的字段,减少数据传输量。

  • 分库分表如果数据量持续增长,考虑对orders表进行分库分表操作,将数据分散存储,减轻单库压力  

6. 验证优化效果 在测试环境中执行优化后的SQL语句,再次使用EXPLAIN查看执行计划,确认type变为refrows大幅减少,Extra中不再有Using filesort等影响性能的信息。同时,监控线上接口的响应时间,确保问题得到有效解决。

通过以上步骤,可以快速定位并解决企业级开发中出现的慢SQL问题,提升系统性能和用户体验。


http://www.ppmy.cn/devtools/169020.html

相关文章

【NLP】 API在大语言模型中的应用

大语言模型(Large Language Models,LLMs)通过API(应用程序接口)为开发者提供了便捷的调用方式,使其能够快速集成自然语言处理能力到各类应用中。以下是API在LLM中的核心应用场景及技术实现细节: 一、核心应…

浅分析 PE3R 感知高效的三维重建

"近期,二维到三维感知技术的进步显著提升了对二维图像中三维场景的理解能力。然而,现有方法面临诸多关键挑战,包括跨场景泛化能力有限、感知精度欠佳以及重建速度缓慢。为克服这些局限,我们提出了感知高效三维重建框架&#…

Python、MATLAB和PPT完成数学建模竞赛中的地图绘制

参加数学建模比赛时,很多题目——诸如统计类、数据挖掘类、环保类、建议类的题目总会涉及到地理相关的情景,往往要求我们制作与地图相关的可视化内容。如下图,这是21年亚太赛的那道塞罕坝的题目,期间涉及到温度、降水和森林覆盖率…

docker最新源,及遇到问题+处理

目前国内可用Docker镜像源汇总(截至2025年3月) - CoderJia 遇到问题: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on [::1]:53: read udp [::1]:13287->[:…

计算机网络快速入门

计算机网络 TCP/IP四层模型四层模型的作用 应用层常见协议HTTP/HTTPSHTTP的常见字段Http和Https的区别HTTPS流程什么是数字证书客户端如何检验证书是否合法 HTTP/1.1、HTTP/2、HTTP/3 演变HTTP/1.1 相比 HTTP/1.0 提高了什么性能?HTTP/2 做了什么优化?HT…

当了5年牛马,我开始划水了。。。

我现在的这份工作,比上一份要好很多,首先薪资直接涨了一倍,7k到16.5k,13薪,朝九晚六,从不加班,项目也简单,包括我在内测试组一共有6个同事,但是每个人分到的任务真的很少…

烽火HG680-KA_海思HI3798MV310_安卓9.0_U盘强刷固件包及注意点说明

之前发布过这个固件包,关于烽火HG680-KA/HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包详细说明一下,汇总总结一些常遇到的情况,这次固件会分开发布,以免混淆。 上一个帖子地址:https://blog.csdn.net/…

ruoyi 小程序使用笔记

1.上传图片 页面 <uni-forms-item label"退休证明(退休证)" name"retire"><uni-file-picker ref"imageUploadRetire" :limit"1" :auto-upload"false" select"upload"/> </uni-forms-item>js …