当前位置: 首页 > article >正文

MySQL慢查询开启与分析优化案例

一、前言1.1 什么是慢查询日志慢查询日志是MySQL提供的一种性能诊断工具用于记录执行时间超过指定阈值的SQL语句。通过分析这些“慢SQL”可以精准定位数据库性能瓶颈优化索引、SQL写法或表结构。1.2 基础知识要求MySQL基础熟悉配置文件、基本SQL命令权限要求需要SUPER或PROCESS权限查看运行状态运维经验了解磁盘空间、日志轮转等基本概念二、慢查询日志的开启方式2.1 临时开启当前会话/全局重启失效sql-- 查看当前慢查询状态 SHOW VARIABLES LIKE %slow_query%; SHOW VARIABLES LIKE %long_query_time%; -- 开启慢查询日志全局立即生效重启失效 SET GLOBAL slow_query_log ON; -- 设置慢查询阈值秒建议设为0.1~2秒之间 SET GLOBAL long_query_time 1; -- 设置日志文件路径可选默认在数据目录下 SET GLOBAL slow_query_log_file /var/lib/mysql/slow-query.log; -- 设置未使用索引的SQL也记录 SET GLOBAL log_queries_not_using_indexes ON;2.2 永久开启修改配置文件Linux/Mac/etc/my.cnf或/etc/mysql/my.cnfWindowsmy.ini[mysqld] # 开启慢查询日志 slow_query_log 1 # 日志文件路径 slow_query_log_file /var/lib/mysql/slow-query.log # 慢查询阈值秒 long_query_time 1 # 记录未使用索引的查询 log_queries_not_using_indexes 1 # 日志输出格式FILE或TABLE默认FILE # log_output FILE配置完成后重启MySQL服务bash# systemctl sudo systemctl restart mysqld # service sudo service mysql restart三、参数解析参数类型默认值说明建议值slow_query_logBooleanOFF是否开启慢查询日志ON生产环境建议开启long_query_timeFloat10.0慢查询阈值秒1~2秒业务敏感可设为0.5slow_query_log_fileStringhostname-slow.log日志文件路径独立目录便于监控log_queries_not_using_indexesBooleanOFF是否记录未使用索引的查询ON找出索引缺失的SQLlog_outputEnumFILE日志输出方式FILE 或 TABLEmin_examined_row_limitInteger0扫描行数超过此值才记录1000过滤小表扫描log_slow_admin_statementsBooleanOFF是否记录慢管理语句如OPTIMIZEON全面监控四、慢查询日志分析工具4.1 使用mysqldumpslow工具MySQL自带日志分析工具可对慢查询日志进行聚合统计。bash# 基本用法 mysqldumpslow /var/lib/mysql/slow-query.log # 常用参数 mysqldumpslow -s t -t 10 /var/lib/mysql/slow-query.log # 按查询时间排序取前10条 mysqldumpslow -s c -t 10 /var/lib/mysql/slow-query.log # 按执行次数排序 mysqldumpslow -s r -t 10 /var/lib/mysql/slow-query.log # 按返回行数排序 mysqldumpslow -a /var/lib/mysql/slow-query.log # 不抽象数字显示具体SQL4.2 使用pt-query-digestPercona Toolkit更强大的第三方分析工具提供详细的统计报告。bash# 安装percona-toolkit # Ubuntu/Debian sudo apt-get install percona-toolkit # CentOS/RHEL sudo yum install percona-toolkit # 分析慢查询日志 pt-query-digest /var/lib/mysql/slow-query.log slow_report.txt # 分析当前运行的查询实时 pt-query-digest --processlist hlocalhost,uroot,ppassword五、实际案例电商订单慢查询优化5.1 案例背景某电商平台订单表orders数据量约500万行业务反馈订单列表页面加载缓慢超过5秒需要定位并优化。5.2 步骤一开启慢查询并复现问题sql-- 临时开启慢查询记录阈值0.5秒 SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 0.5; SET GLOBAL log_queries_not_using_indexes ON; -- 确认日志文件位置 SHOW VARIABLES LIKE slow_query_log_file; -- 结果/var/lib/mysql/slow-query.log执行慢的订单查询SQLsqlSELECT o.order_id, o.user_id, o.order_amount, o.order_status, o.created_at, u.user_name, u.phone FROM orders o LEFT JOIN users u ON o.user_id u.user_id WHERE o.order_status pending AND o.created_at 2024-01-01 AND o.created_at 2024-02-01 ORDER BY o.created_at DESC LIMIT 20;5.3 步骤二分析慢查询日志bash# 查看慢查询日志 mysqldumpslow -s t -t 5 /var/lib/mysql/slow-query.log日志输出textCount: 156 Time3.52s (549s) Lock0.01s (1.56s) Rows_sent20.0 (3120), Rows_examined5234567.0 (816M), root[root]localhost SELECT o.order_id, o.user_id, o.order_amount, o.order_status, o.created_at, u.user_name, u.phone FROM orders o LEFT JOIN users u ON o.user_id u.user_id WHERE o.order_status S AND o.created_at YYYY-MM-DD AND o.created_at YYYY-MM-DD ORDER BY o.created_at DESC LIMIT N关键信息平均耗时3.52秒平均扫描行数523万行几乎全表扫描执行次数156次总耗时549秒5.4 步骤三使用EXPLAIN分析执行计划sqlEXPLAIN SELECT o.order_id, o.user_id, o.order_amount, o.order_status, o.created_at, u.user_name, u.phone FROM orders o LEFT JOIN users u ON o.user_id u.user_id WHERE o.order_status pending AND o.created_at 2024-01-01 AND o.created_at 2024-02-01 ORDER BY o.created_at DESC LIMIT 20\GEXPLAIN结果idselect_typetabletypepossible_keyskeykey_lenrowsExtra1SIMPLEoALLidx_created_atNULLNULL5,234,567Using where; Using filesort1SIMPLEueq_refPRIMARYPRIMARY41NULL问题诊断typeALLorders表全表扫描未使用任何索引rows≈523万扫描全部数据行Extra包含Using filesortORDER BY需要额外排序无法利用索引possible_keys显示idx_created_at虽然有created_at索引但优化器未选择5.5 步骤四深入分析索引失效原因sql-- 查看orders表现有索引 SHOW INDEX FROM orders;现有索引PRIMARY KEY (order_id)INDEX idx_user_id (user_id)INDEX idx_created_at (created_at)INDEX idx_status (order_status)索引失效分析WHERE条件包含order_status和created_at两个字段MySQL优化器判断使用任一单列索引都需要回表过滤另一个条件扫描行数依然很大最终选择了全表扫描5.6 步骤五制定优化方案方案一创建联合索引推荐sql-- 创建联合索引将等值查询字段放前面范围查询放后面 CREATE INDEX idx_status_created ON orders (order_status, created_at); -- 验证索引效果 EXPLAIN SELECT ...同原SQL\G优化后EXPLAIN结果tabletypekeykey_lenrowsExtraorangeidx_status_created102185,000Using where;Using index conditionueq_refPRIMARY41NULL优化效果扫描行数从523万降到18.5万减少96.5%执行时间从3.5秒降至0.08秒方案二使用覆盖索引进一步优化sql-- 创建覆盖索引避免回表查询 -- 注意 -- 创建索引需要在线上业务停止时进行避免死锁 -- 覆盖索引需要包含所有查询字段 -- 重建索引可能需要很长时间可能破坏数据建议先备份数据 CREATE INDEX idx_status_created_cover ON orders (order_status, created_at, order_id, user_id, order_amount); -- 但orders表字段较多覆盖索引可能过大需权衡方案三SQL语句改写sql-- 使用子查询先筛选出订单ID再关联用户表 SELECT o.order_id, o.user_id, o.order_amount, o.order_status, o.created_at, u.user_name, u.phone FROM ( SELECT order_id, user_id, order_amount, order_status, created_at FROM orders WHERE order_status pending AND created_at 2024-01-01 AND created_at 2024-02-01 ORDER BY created_at DESC LIMIT 20 ) o LEFT JOIN users u ON o.user_id u.user_id;5.7 步骤六验证优化效果sql-- 再次查看慢查询日志mysqldumpslow -s t -t 5 /var/lib/mysql/slow-query.log优化后日志textCount: 156 Time0.08s (12.48s) Lock0.00s (0s) Rows_sent20.0 (3120), Rows_examined185000.0 (28.86M), root[root]localhost SELECT ...优化成果总结指标优化前优化后提升平均耗时3.52秒0.08秒97.7%↓扫描行数523万18.5万96.5%↓总耗时/天549秒12.5秒97.7%↓六、更多实际案例6.1 案例二隐式类型转换导致索引失效问题SQLsql-- phone字段定义为varchar(20)但传入数字类型 SELECT * FROM users WHERE phone 13800138000;EXPLAIN分析typeALLkeyNULLrows全表原因MySQL将phone字段自动转换为数字类型导致索引失效优化sql-- 正确写法传入字符串 SELECT * FROM users WHERE phone 13800138000;6.2 案例三函数操作导致索引失效(和mysql版本有关系)问题SQLsqlSELECT * FROM orders WHERE DATE(created_at) 2024-01-15;优化sqlSELECT * FROM orders WHERE created_at 2024-01-15 AND created_at 2024-01-16;6.3 案例四分页查询深度过大问题SQLsql-- 第10000页每页20条 SELECT * FROM orders ORDER BY order_id LIMIT 200000, 20;优化方案延迟关联sqlSELECT * FROM orders o INNER JOIN ( SELECT order_id FROM orders ORDER BY order_id LIMIT 200000, 20 ) t ON o.order_id t.order_id;七、生产环境最佳实践7.1 慢查询阈值设置建议OLTP系统高并发0.5~1秒OLAP系统分析查询2~5秒核心交易链路0.1~0.3秒配合监控告警7.2 日志管理定期轮转避免占满磁盘使用logrotate工具管理日志生产环境建议将log_output设为TABLE便于SQL查询分析sql-- 将日志输出到mysql.slow_log表 SET GLOBAL log_output TABLE; -- 查询慢日志表 SELECT * FROM mysql.slow_log WHERE query_time 2 ORDER BY start_time DESC LIMIT 10;7.3 监控告警接入Prometheus/Grafana监控慢查询数量趋势设置告警每分钟慢查询数 10 或 某SQL耗时 5秒7.4 慢查询分析流程总结text开启慢查询 → 收集日志 → 分析TOP慢SQL → EXPLAIN执行计划 → 定位问题 ↑ ↓ 监控告警 ← 验证效果 ← 上线变更 ← 制定优化方案 ← 索引失效/扫描行数多八、学习建议循序渐进先从mysqldumpslow入手掌握基础分析后再引入pt-query-digest结合EXPLAIN每个慢SQL都要用EXPLAIN分析理解MySQL优化器的选择建立知识库记录常见慢查询模式及优化方案隐式转换、函数操作、排序问题等预防为主上线前通过EXPLAIN审核新SQL避免慢查询流入生产定期巡检每周分析慢查询日志发现潜在性能隐患

相关文章:

MySQL慢查询开启与分析优化案例

一、前言1.1 什么是慢查询日志慢查询日志是MySQL提供的一种性能诊断工具,用于记录执行时间超过指定阈值的SQL语句。通过分析这些“慢SQL”,可以精准定位数据库性能瓶颈,优化索引、SQL写法或表结构。1.2 基础知识要求MySQL基础:熟悉…...

【深度学习】遥感影像变化检测:从模型演进到实战选型

1. 遥感影像变化检测:从“找不同”到“智能感知” 还记得小时候玩的“找不同”游戏吗?给你两张看似一样的图片,让你圈出其中的差异点。遥感影像变化检测,本质上就是给地球这个“大家伙”玩一场超级复杂的“找不同”游戏。只不过&a…...

redis的数据类型及java调用案例

Redis 的丰富数据类型是它能够适应多种场景的核心原因。下面我会结合 Java&#xff08;Jedis 客户端&#xff09; 的代码示例&#xff0c;为你展示每种类型的典型用法和应用场景。1. 准备工作&#xff1a;Java 连接 Redisxml<!-- Maven 依赖 --> <dependency> <…...

Nanbeige 4.1-3B清爽WebUI效果展示:支持语音输入转文字+AI回复一体化

Nanbeige 4.1-3B清爽WebUI效果展示&#xff1a;支持语音输入转文字AI回复一体化 1. 引言&#xff1a;当AI对话遇见极简美学 想象一下&#xff0c;你打开一个AI对话界面&#xff0c;看到的不是拥挤的侧边栏、死板的方形头像和密密麻麻的按钮&#xff0c;而是一个像手机短信应用…...

A*算法是路径规划领域的经典算法,但在实际应用中可能存在一些不足。为了提高效率和效果,我们可以对其进行改进

改进A*算法 算法对比 数据详细 路径规划算法 Matlab 传统A*算法 先来看传统A*算法的基本框架&#xff1a; function path aStarSearch(grid, start, goal)% 初始化优先队列priorityQueue [];% 评估函数值g zeros(size(grid));h ones(size(grid));% 父节点记录parent ze…...

保姆级教程:用Android Studio CPU Profiler分析视频播放卡顿问题(含火焰图解读技巧)

深度解析Android视频播放卡顿&#xff1a;CPU Profiler实战与火焰图精读指南 当你在开发一款视频类应用时&#xff0c;是否遇到过这样的场景&#xff1a;用户反馈播放高清视频时频繁卡顿&#xff0c;评论区充斥着"一卡一卡的"、"看着头晕"的差评&#xff1…...

Linux下frp内网穿透实战:从零搭建安全高效的远程访问通道

1. 为什么你需要frp内网穿透&#xff1f; 想象一下这个场景&#xff1a;你在家里搭建了一个NAS存储服务器&#xff0c;存满了珍贵的家庭照片和工作文档&#xff1b;或者你在办公室的Linux服务器上部署了一个内部使用的Web应用。这些服务运行得非常好&#xff0c;但有个致命问题…...

CUDA编程避坑指南:共享内存Bank Conflict的实战排查与优化(附NVIDIA Nsight工具使用)

CUDA共享内存性能调优实战&#xff1a;从Bank Conflict诊断到Nsight工具链深度解析 当你的CUDA Kernel性能提升陷入瓶颈时&#xff0c;共享内存可能是那个既熟悉又陌生的关键因素。作为GPU编程中最接近寄存器速度的内存资源&#xff0c;共享内存理论上能带来数量级的加速&…...

微信小程序滚动加载实战:如何避免列表卡顿(附完整代码)

微信小程序滚动加载实战&#xff1a;如何避免列表卡顿&#xff08;附完整代码&#xff09; 在移动互联网时代&#xff0c;用户体验的流畅度直接决定了产品的留存率。对于微信小程序开发者而言&#xff0c;列表滚动卡顿是一个常见但棘手的问题&#xff0c;尤其是在电商商品列表、…...

Mininet与OpenFlow控制器集成指南:从Floodlight到OpenDaylight

Mininet与OpenFlow控制器集成指南&#xff1a;从Floodlight到OpenDaylight 引言 在软件定义网络&#xff08;SDN&#xff09;的研究与开发中&#xff0c;Mininet作为轻量级网络仿真工具已成为不可或缺的利器。它能在单台机器上快速构建包含虚拟主机、交换机和控制器的完整网络环…...

Python新手必看:如何快速解决‘str‘ object has no attribute ‘to‘错误(附真实案例)

Python新手必看&#xff1a;如何快速解决str object has no attribute to错误&#xff08;附真实案例&#xff09; 刚接触Python编程时&#xff0c;遇到各种报错信息总是让人头疼不已。其中AttributeError: str object has no attribute to这类错误尤为常见&#xff0c;它看似简…...

YOLOv8实战:从检测框到中心坐标的精准提取与应用

1. 为什么需要提取物体中心坐标&#xff1f; 在目标检测任务中&#xff0c;我们通常使用边界框&#xff08;bounding box&#xff09;来标识物体的位置。但很多时候&#xff0c;仅仅知道物体的边界框是不够的。比如在做物体追踪时&#xff0c;我们需要一个更简洁的表示方式——…...

GME-Qwen2-VL-2B软件重构指南:识别并改善代码中的耦合过度问题

GME-Qwen2-VL-2B软件重构指南&#xff1a;识别并改善代码中的耦合过度问题 你是不是也遇到过这样的场景&#xff1f;接手一个老项目&#xff0c;想改一个功能&#xff0c;结果发现牵一发而动全身&#xff0c;改A模块的代码&#xff0c;B、C、D模块都跟着报错。或者&#xff0c…...

信号与系统实战:5个拉普拉斯变换典型例题解析(附MATLAB验证代码)

信号与系统实战&#xff1a;5个拉普拉斯变换典型例题解析&#xff08;附MATLAB验证代码&#xff09; 拉普拉斯变换作为信号与系统课程的核心工具&#xff0c;其工程价值往往被理论教学的抽象性所掩盖。许多电子信息工程专业的学生能够熟练背诵变换公式&#xff0c;却在面对实际…...

保姆级教程:用OpenVINO在Intel显卡上跑通PP-OCRv5文字识别(附环境配置避坑指南)

保姆级教程&#xff1a;用OpenVINO在Intel显卡上跑通PP-OCRv5文字识别&#xff08;附环境配置避坑指南&#xff09; 在数字化转型浪潮中&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术已成为企业文档处理、票据识别和自动化办公的核心工具。飞桨推出的PP-OCRv5以其…...

【C#避坑实战系列文章08】C#并行处理资源瓶颈诊断:用PerformanceCounter定位CPU/内存热点,优化并行度与算法

1. 从监控到诊断&#xff1a;PerformanceCounter的进阶玩法 很多C#开发者都遇到过这样的场景&#xff1a;你的并行处理程序在服务器上跑得风生水起&#xff0c;突然某天运维同事怒气冲冲地找上门——"你们的服务又把服务器CPU吃满了&#xff01;"。你打开任务管理器&…...

病理图像处理新手必看:SVS和TIFF格式转换的5个实用技巧(附代码示例)

病理图像处理新手必看&#xff1a;SVS和TIFF格式转换的5个实用技巧&#xff08;附代码示例&#xff09; 在医学研究和人工智能开发领域&#xff0c;病理图像处理已成为不可或缺的关键环节。对于刚接触这一领域的研究人员和开发者来说&#xff0c;如何高效处理SVS和TIFF这两种主…...

HFSS仿真教程:用Ansys还原AirPods蓝牙天线设计(含LDS工艺参数)

HFSS仿真教程&#xff1a;用Ansys还原AirPods蓝牙天线设计&#xff08;含LDS工艺参数&#xff09; 当拆解AirPods时&#xff0c;最令人惊叹的莫过于其内部精密的天线设计——如何在如此紧凑的空间内实现稳定的蓝牙连接&#xff1f;这正是射频工程师需要掌握的三维电磁场仿真技术…...

信创实战:在麒麟V10上构建.NET 6与金仓数据库的完整应用栈

1. 环境准备&#xff1a;从零搭建国产化开发平台 第一次在麒麟V10上折腾.NET 6和金仓数据库时&#xff0c;我踩了不少坑。记得当时为了找个靠谱的安装指南&#xff0c;翻遍了各种论坛和技术文档。现在把完整流程梳理出来&#xff0c;希望能帮你少走弯路。 硬件配置建议&#xf…...

计算机组成原理实验避坑指南:原码乘法运算器的寄存器级联问题详解

计算机组成原理实验避坑指南&#xff1a;原码乘法运算器的寄存器级联问题详解 在计算机组成原理的实验课程中&#xff0c;原码乘法运算器的设计是一个经典而富有挑战性的项目。许多学生在完成这个实验时&#xff0c;往往会遇到各种意想不到的问题&#xff0c;尤其是在A寄存器和…...

Confluence数据安全指南:手动备份+定时任务全流程(附30天自动清理脚本)

Confluence数据安全实战&#xff1a;从手动备份到智能清理的完整方案 在数字化协作时代&#xff0c;Confluence作为企业知识管理的核心平台&#xff0c;承载着大量关键业务数据。一次意外的数据丢失可能导致数月的工作成果付诸东流&#xff0c;而合理的备份策略则是抵御这类风险…...

Solidworks装配体Toolbox标准件修改全攻略:从尺寸调整到材质替换

Solidworks装配体Toolbox标准件修改全攻略&#xff1a;从尺寸调整到材质替换 在机械设计领域&#xff0c;Solidworks的Toolbox标准件库堪称效率神器。但许多设计师在使用过程中都遇到过这样的困扰&#xff1a;为什么修改后的螺栓尺寸会自动还原&#xff1f;如何快速调整标准件…...

Druid连接池配置避坑指南:如何避免getConnection()无限等待导致服务崩溃

Druid连接池配置避坑指南&#xff1a;如何避免getConnection()无限等待导致服务崩溃 在微服务架构中&#xff0c;数据库连接池的配置不当往往是系统稳定性的隐形杀手。最近遇到一个典型案例&#xff1a;某电商平台的订单服务在高峰期频繁出现服务不可用&#xff0c;但日志中却没…...

ESP32+ENC28J60以太网Web服务器兼容库

1. 项目概述WebServer_ESP32_ENC 是一个专为 ESP32 平台设计的、面向 ENC28J60 以太网控制器的轻量级 Web 服务封装库。其核心定位并非从零构建 TCP/IP 协议栈&#xff0c;而是深度集成 ESP32 官方 SDK 中成熟的 LwIP 协议栈与硬件抽象层&#xff08;HAL&#xff09;&#xff0…...

VisionMaster 4.2.0新功能体验:图形化编程如何简化工业视觉项目开发

VisionMaster 4.2.0新功能深度解析&#xff1a;图形化编程如何重塑工业视觉开发效率 工业视觉系统开发正经历一场静默革命——传统需要数百行代码实现的检测逻辑&#xff0c;如今通过拖拽模块和连线就能完成。VisionMaster 4.2.0的图形化编程界面将这一变革推向新高度&#xff…...

突破视觉局限:多光谱AI检测技术全栈实践

突破视觉局限&#xff1a;多光谱AI检测技术全栈实践 【免费下载链接】multispectral-object-detection Multispectral Object Detection with Yolov5 and Transformer 项目地址: https://gitcode.com/gh_mirrors/mu/multispectral-object-detection 传统计算机视觉系统如…...

MCP与VS Code深度协同实战:从环境搭建到实时双向调试,7步完成企业级开发闭环

第一章&#xff1a;MCP与VS Code深度协同的核心价值与适用场景MCP&#xff08;Microsoft Cloud Platform&#xff09;工具链与 VS Code 的深度协同&#xff0c;本质上是将云原生开发范式无缝嵌入开发者日常编码环境的关键实践。这种集成并非简单插件叠加&#xff0c;而是通过语…...

Asian Beauty Z-Image Turbo 开发环境搭建:Ubuntu 20.04系统配置全攻略

Asian Beauty Z-Image Turbo 开发环境搭建&#xff1a;Ubuntu 20.04系统配置全攻略 最近有不少朋友在问&#xff0c;想在自己的服务器上跑一些AI图像生成的应用&#xff0c;比如这个挺火的Asian Beauty Z-Image Turbo镜像&#xff0c;但第一步就被环境搭建给卡住了。确实&…...

实测Face Analysis WebUI:3步完成人脸检测+年龄预测+性别识别,效果惊艳

实测Face Analysis WebUI&#xff1a;3步完成人脸检测年龄预测性别识别&#xff0c;效果惊艳 1. 开箱即用&#xff1a;一个能“看懂”人脸的智能工具 你有没有想过&#xff0c;让电脑像人一样“看”懂一张照片里的人物信息&#xff1f;不是简单地识别出这是个人&#xff0c;而…...

Phi-3 Forest Laboratory 在STM32嵌入式开发中的应用猜想:代码注释与协议解析

Phi-3 Forest Laboratory&#xff1a;让STM32嵌入式开发更“聪明”的桌面助手 每次面对STM32那密密麻麻的寄存器手册&#xff0c;或者是一段十年前、注释寥寥无几的祖传代码时&#xff0c;你是不是也感到一阵头大&#xff1f;尤其是当你手头只有一块像STM32F103C8T6这样的最小…...