如何使用MySQL快速定位慢SQL问题?企业级开发中常见业务场景中实际发生的例子,涉及分页查询问题。(二)

news2025/3/19 8:58:35

如何使用MySQL快速定位慢SQL问题?

        在企业级开发中,尤其是涉及到订单查询的业务时,经常会发生慢查询的问题。比如用户翻页到后面的页数时,查询变慢,因为传统的LIMIT offset, size在数据量大时效率低下。这时候,需要分析执行计划,看看是否全表扫描,或者索引使用情况。可能的问题是没有使用覆盖索引,或者offset过大导致扫描大量数据。
        在定位和优化慢查询问题的时候,首先需要开启慢查询日志然后,设置合适的阈值,比如超过2秒的查询记录下来。接着,通过日志分析工具,比如mysqldumpslow(Percona的pt-query-digest也可以),来找出最耗时的查询。接下来,优化方法可能需要使用延迟关联,或者基于游标的分页,比如记录上一页的最大ID,这样避免使用大的offset。同时,添加合适的索引,比如在查询条件和排序字段上建立复合索引,可能覆盖查询所需字段,减少回表操作。

        另外,为了以后避免类似问题再次发生,在实际开发中的代码审查时要注意分页写法。

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

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

示例二:(第一个例子在上一篇博文中,这是第二个例子。)

场景背景

某订单管理平台订单列表页出现性能问题:当用户查询历史订单(特别是翻页到100页之后)时,页面响应时间超过5秒,收到用户反馈对该问题进行定位和优化。

  • 订单表结构(实际企业级开发中的订单表结构远比一下列出的更加复杂,再次为了方便举例和理解,做了简化):

    CREATE TABLE orders (
      id BIGINT PRIMARY KEY,
      user_id INT NOT NULL,
      order_status TINYINT,
      create_time DATETIME,
      total_amount DECIMAL(10,2),
      INDEX idx_user (user_id)
    );

第一阶段:问题定位

1. 启用慢查询日志

-- 动态开启(生产环境慎用)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2; -- 捕获超过2秒的查询
SET GLOBAL log_queries_not_using_indexes = 'ON'; -- 记录未走索引的查询

2. 分析工具(这里使用的是mysqldumpslow,如果想进行更加深度的分析,可以使用Percona Toolkit)

# 分析最耗时的前10个慢查询
mysqldumpslow -s t -t 10 /var/lib/mysql/slow.log

# 分析特定模式的查询(如包含SELECT的语句)
mysqldumpslow -g "SELECT" /var/lib/mysql/slow.log
3. 分析工具输出解析
Count: 128  Time=3.24s (414s)  Lock=0.00s (0s)  Rows=20.0 (2560)
  SELECT id, user_id, order_status, create_time, total_amount 
  FROM orders 
  WHERE user_id = N 
  ORDER BY create_time DESC 
  LIMIT N, N

输出关键指标解读:

  • Count: 该模式查询发生的总次数(128次)

  • Time: 平均执行时间3.24s,总耗时414秒

  • Rows: 平均返回20行,总计2560行

  • 暴露高频慢SQL模式:带大偏移量的分页查询


第二阶段:问题分析

1. 执行计划分析
EXPLAIN SELECT ... -- 显示type=range, key=idx_user, rows=10240

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

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

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

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

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

分析:

  • 虽然使用了user_id索引,但需要回表获取所有字段

  • LIMIT 10000,20导致扫描前10020行再丢弃前10000行

2. 性能瓶颈点
  • 索引覆盖不全:idx_user仅包含user_id

  • 分页深度过大时产生大量无效IO

  • 排序字段与索引顺序不一致导致filesort


第三阶段:确定优化方案

方案1:延迟关联优化
SELECT o.* 
FROM orders o
JOIN (
    SELECT id
    FROM orders
    WHERE user_id = 123
    ORDER BY create_time DESC
    LIMIT 10000, 20
) AS tmp USING(id);
  • 子查询使用覆盖索引快速定位主键

  • 外层查询通过主键快速获取完整数据

方案2:索引优化
ALTER TABLE orders 
ADD INDEX idx_user_create_time(user_id, create_time DESC);
  • 覆盖查询条件和排序字段:将(user_id, create_time DESC)作为联合索引

  • 避免filesort和随机IO

方案3:游标分页优化:优化limit

记录上一页最后一条记录的create_time:

SELECT * 
FROM orders 
WHERE user_id = 123 
  AND create_time < '2023-08-20 14:30:00' 
ORDER BY create_time DESC 
LIMIT 20;

第四阶段:效果验证

优化后执行计划显示:

  • type=ref

  • key=idx_user_create_time

  • Extra=Using index

压测结果对比:

指标优化前优化后
查询时间(10000 offset)4.8s32ms
IO次数1024020
锁等待时间220ms0ms

如何避免类型情况再次发生?

  1. 预防

  • 代码审查时禁止直接使用LIMIT offset
  • 分页深度超过100时强制转为游标分页

    2.监控

-- 使用performance_schema实时监控
SELECT * 
FROM performance_schema.events_statements_summary_by_digest 
ORDER BY sum_timer_wait DESC 
LIMIT 10;

经验总结

  1. 分页查询超过1000行偏移量必须优化

  2. 组合索引字段顺序遵循WHEREORDER BYSELECT原则

  3. OLTP系统单表数据量超过500万需考虑分库分表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新造车不再比拼排名,恰是曲终人散时,剩者为王

据称新能源汽车周销量不再发布&#xff0c;这可能也预示着新造车终于到了给出答案的时候了&#xff0c;新造车企业前三强已基本确立&#xff0c;其余那些落后的车企已很难有突围的机会&#xff0c;而特斯拉无疑是其中的最大赢家。 3月份第一周的数据显示&#xff0c;销量最高的…

博客迁移----宝塔面板一键迁移遇到问题

前景 阿里云轻量级服务器到期了&#xff0c;又免费领了个ESC&#xff0c; 安转了宝塔面板。现在需要迁移数据&#xff0c;使用宝塔面板一键迁移功能&#xff0c;完成了数据的迁移&#xff0c;改了域名的解析&#xff0c;现在进入博客是显示502 bad grateway 宝塔搬家参考链接…

大数据处理最容易的开源平台

大数据处理最容易的开源平台可以从多个角度进行分析&#xff0c;包括易用性、灵活性、成本效益以及社区支持等方面。 Apache Spark Apache Spark 是一个广泛使用的开源大数据处理框架&#xff0c;以其快速、通用和易于使用的特点而著称。它支持多种编程语言&#xff08;如 Scal…

Dify 使用 - 创建 翻译 工作流

文章目录 1、选择 模板2、设置 和 基本使用3、运行应用 1、选择 模板 2、设置 和 基本使用 翻译模板 自带了系统提示词&#xff0c;你也可以修改 3、运行应用 右上角 点击 发布 – 更新&#xff0c;运行应用&#xff0c;就可以在新的对话界面中使用此功能 2025-03-18&#x…

TreelabPLMSCM数字化供应链解决方案0608(61页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。 资料解读&#xff1a;TreelabPLMSCM 数字化供应链解决方案 0608 在当今快速变化的市场环境中&#xff0c;企业面临着诸多挑战&#xff0c;Treelab 数智化 PLM_SCM 行业解决方案应运而生。该方案聚焦市场趋势与行业现状&#xff0c;致力于解…

LogicFlow介绍

LogicFlow介绍 LogicFlow是一款流程图编辑框架&#xff0c;提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端自定义开发各种逻辑编排场景&#xff0c;如流程图、ER图、BPMN流程等。在工作审批流配置、机器人逻辑编排、无代码平…

[蓝桥杯 2023 省 B] 飞机降落

[蓝桥杯 2023 省 B] 飞机降落 题目描述 N N N 架飞机准备降落到某个只有一条跑道的机场。其中第 i i i 架飞机在 T i T_{i} Ti​ 时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 D i D_{i} Di​ 个单位时间&#xff0c;即它最早可以于 T i T_{i} Ti​ 时刻…

应用分层简介

一、什么是应用分层 应用分层是一种软件开发设计思想&#xff0c;它将应用程序分为多个层次&#xff0c;每个层次各司其职&#xff0c;多个层次之间协同提供完整的功能&#xff0c;根据项目的复杂程度&#xff0c;将项目分为三层或者更多层。 常见的MCV设计模式&#xff0c;就…

基于香橙派 KunpengPro学习CANN(3)——pytorch 模型迁移

通用模型迁移适配可以分为四个阶段&#xff1a;迁移分析、迁移适配、精度调试与性能调优。 迁移分析 迁移支持度分析&#xff1a; 准备NPU环境&#xff0c;获取模型的源码、权重和数据集等文件&#xff1b;使用迁移分析工具采集目标网络中的模型/算子清单&#xff0c;识别第三方…

电子硬件入门(三)——偏置电路

文章目录 一、先理解问题&#xff1a;为什么需要偏置电压&#xff1f;二.偏置电路生成的四大核心零件​三、工作流程图解​四、实物电路对照​五、常见问题答疑 一、先理解问题&#xff1a;为什么需要偏置电压&#xff1f; 想象一下&#xff0c;电机的电流像一条波浪线&#x…

使用C++写一个递推计算均方差和标准差的用例

文章目录 代码输出关键实现说明1. 类设计2. 算法核心3. 数值稳定性 扩展应用场景1. 实时传感器数据处理2. 大规模数据集分块处理 总结 以下是用 C 实现递推计算均值、方差和标准差的完整示例代码&#xff0c;基于 Welford 算法&#xff0c;适用于实时数据流或大数据场景&#x…

Vue:单文件组件

Vue&#xff1a;单文件组件 1、 什么是单文件组件&#xff1f; 在传统的Vue开发里&#xff0c;我们接触的是非单文件组件&#xff0c;它们通常被定义在同一个HTML文件中&#xff0c;随着项目规模的扩大&#xff0c;代码会变得杂乱无章&#xff0c;维护起来极为困难。而单文件…

JavaScript变量声明与DOM操作指南

变量声明 1.变量声明有三个 var let 和 const 我们应该用那个呢&#xff1f; 首先var 先排除&#xff0c;老派写法&#xff0c;问题很多&#xff0c;可以淘汰掉… 2.let or const ? 建议&#xff1a; const 优先&#xff0c;尽量使用const&#xff0c;原因是&#xff1a;…

[K!nd4SUS 2025] Crypto

最后一个把周末的补完。这个今天问了小鸡块神终于把一个补上&#xff0c;完成5/6&#xff0c;最后一个网站也上不去不弄了。 Matrices Matrices Matrices 这个是不是叫LWE呀&#xff0c;名词忘了&#xff0c;但意思还是知道。 b a*s e 这里的e是高斯分成&#xff0c;用1000…

工作记录 2017-02-04

工作记录 2017-02-04 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、DataExport的设置中去掉了ListPayors&#xff0c;见DataExport\bin\dataexport.xml 2、“IPA/Group Name” 改为 “Insurance Name”。 3、修改了Payment Posted的E…

Etcd 服务搭建

&#x1f4a2;欢迎来到张胤尘的开源技术站 &#x1f4a5;开源如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Etcd 服务搭建预编译的二进制文件安装下载 etcd 的…

【C++】stack和queue的使用及模拟实现(含deque的简单介绍)

文章目录 前言一、deque的简单介绍1.引入deque的初衷2.deque的结构3.为什么选择deque作为stack和queue的底层默认容器 二、stack1.stack的介绍2.stack的使用3.stack的模拟实现 三、queue1.queue的介绍2.queue的使用3.queue的模拟实现 前言 一、deque的简单介绍&#xff08;引入…

MySQL原理:逻辑架构

目的&#xff1a;了解 SQL执行流程 以及 MySQL 内部架构&#xff0c;每个零件具体负责做什么 理解整体架构分别有什么模块每个模块具体做什么 目录 1 服务器处理客户端请求 1.1 MySQL 服务器端逻辑架构说明 2 Connectors 3 第一层&#xff1a;连接层 3.1 数据库连接池(Conn…

ora-600 ktugct: corruption detected---惜分飞

接手一个oracle 21c的库恢复请求,通过Oracle数据库异常恢复检查脚本(Oracle Database Recovery Check)脚本检测之后,发现undo文件offline之后,做了resetlogs操作,导致该文件目前处于WRONG RESETLOGS状态 尝试恢复数据库ORA-16433错误 SQL> recover datafile 1; ORA-00283:…

Houdini :《哪吒2》神话与科技碰撞的创新之旅

《哪吒2》&#xff08;即《哪吒之魔童闹海》&#xff09;截止至今日&#xff0c;荣登全球票房榜第五。根据猫眼专业版数据&#xff0c;截至2025年3月15日&#xff0c;《哪吒2》全球累计票房&#xff08;含预售及海外&#xff09;超过150.19亿元&#xff0c;超越《星球大战&…