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

MySQL慢查询及解决方案

一、前言

对于生产业务系统来说,慢查询也是一种故障和风险,一旦出现故障将会造成系统不可用影响到生产业务。当有大量慢查询并且SQL执行得越慢,消耗的CPU资源或IO资源也会越大,因此,要解决和避免这类故障,关注慢查询本身是关键。

二、慢查询

2.1 什么是慢查询?

慢查询,顾名思义,执行很慢的查询。当执行SQL超过long_query_time参数设定的时间阈值(默认10s)时,就被认为是慢查询,这个SQL语句就是需要优化的。慢查询被记录在慢查询日志里。慢查询日志默认是不开启的。如果需要优化SQL语句,就可以开启这个功能,它可以让你很容易地知道哪些语句是需要优化的。

2.2 慢查询配置

以MySQL数据库为例,默认慢查询功能是关闭的,当慢查询开关打开后,并且执行的SQL语句达到参数设定的阈值后,就会触发慢查询功能打印出日志。

1、慢查询日志

操作SQL语句
查询是否开启 show variables like "slow_query_log";
开启慢查询 set global slow_query_log = 1/on;
关闭慢查询 set global slow_query_log = 0/off;

2、未使用索引是否开启日志

操作SQL语句
查询是否开启 show variables like "log_queries_not_using_indexes";
开启记录 set global log_queries_not_using_indexes=1/on;
关闭记录 set global log_queries_not_using_indexes=0/off;

3、慢查询时间设置

操作SQL语句
查询阈值 show variables like "long_query_time";
设置阈值 set global long_query_time= X;

注意:上述参数设置在当前数据库生效,MySQL重启后会失效。如需永久生效,必须修改配置文件my.cnf

4、慢查询路径

show variables like "slow_query_log_file%";

示例路径:/apps/log/mysql/slow3306.log

三、慢查询日志分析

3.1 mysqldumpslow工具

使用mysqldumpslow工具分析慢查询日志:

# 查询用时最多的10条慢sql
mysqldumpslow -s t -t 10 -g "select" /data/mysql/data/dcbi-3306/log/slow.log

日志字段说明:

字段含义
Count 该SQL语句执行了多少次
Time 执行时间,括号内为累计时间
Lock 锁定时间,括号内为累计时间
Rows 返回的记录数,括号内为累计记录数

通过慢查询日志分析,可以更有针对性和更快捷地处理出现慢查询的SQL语句问题。

四、慢查询解决方案

4.1 索引失效

常见索引失效情况:

  1. LIKE关键字查询
    • 匹配字符串第一个字符为"%":索引不起作用
    • "%"不在第一个位置:索引才会起作用
  2. 多列索引查询
    • 只有查询条件使用了第一个字段时,索引才会被使用
    • 遵循左匹配原则

4.2 SQL语句优化

  1. 查询语句应尽量避免全表扫描,首先考虑在WHERE和ORDER BY子句上建立索引
  2. 避免使用INNOT IN,尽量用EXISTSNOT EXISTS(后者可能导致全表扫描)
  3. 避免在WHERE子句中对字段进行NULL判断(会导致全表扫描)
  4. 避免在WHERE子句中使用or作为连接条件(会导致全表扫描)
  5. 避免使用!=<>操作符(会导致全表扫描)
  6. 使用like "%abc%"like "%abc"会导致全表扫描,like "abc%"会使用索引
  7. 使用UNION时,考虑用UNION ALL代替(后者不进行排序去重,性能更高)
  8. 避免在WHERE子句中使用表达式操作符
  9. 避免在WHERE子句中对字段使用函数
  10. SELECT *语句尽量避免使用(解析时需转换为所有列名,有额外开销)
  11. WHERE子句中,表连接条件应写在其他条件之前(解析从后向前)
  12. 联合索引字段顺序应与WHERE子句条件顺序一致
  13. FROM子句中写在末尾的表将被优先处理,应选择记录较少的表作为基表
  14. 使用>=代替>操作符,性能更高效

4.3 表结构优化

  1. 每条SQL语句最多只可能使用一个索引
  2. InnoDB表必须指定主键(自动生成的主键性能不足、并发不足)
  3. 区分度不大的字段不要建立索引
  4. 一个字段只需建一种索引
  5. 大文本字段或BLOB字段不要建立索引
  6. 连接查询的连接字段应建立索引
  7. 排序字段一般要建立索引
  8. 分组统计字段一般要建立索引
  9. 正确使用联合索引(第一个字段可单独使用)
  10. 索引一般用于记录比较多的表

五、总结

在日常写SQL和写程序时多关注基本的SQL语句,在业务复杂的系统中,除了上述基本的点外,尽管使用了索引,也还需要从业务本身出发。如:当查询的数量过大时,时间索引已经不满足,可以改为分批次来查询控制数量等。

关键要点汇总:

类别核心要点
慢查询定义 执行时间超过long_query_time(默认10秒)的SQL
日志开启 slow_query_log = ON
阈值设置 long_query_time = X
分析工具 mysqldumpslow
索引失效 LIKE以%开头、多列索引未使用左匹配
优化原则 避免全表扫描、合理建立索引、表结构优化

原文链接:CSDN原文

http://www.jsqmd.com/news/778997/

相关文章:

  • Winform 两个页面中间的值互相传递
  • 一键下载DLL 文件,链接在这里
  • 奇点大会不是展会,是AI产业分水岭:基于2025全球17家头部机构内部评估报告的5维竞争力对标分析
  • 硅谷AI金融平台AlphaAI进驻香港,亚太运营中心将于5月20日正式开幕
  • 5分钟搞定华硕笔记本性能控制:G-Helper终极轻量化解决方案
  • 室内儿童淘气堡中海洋球闯关与男生女生向前冲游戏的机制差异、体验比较及教育价值研究
  • 自行车加强件拓扑优化-CAE操作过程
  • ClipSync - 基于webRTC和TURN协议的局域网/远程同步工具
  • 技术创业者如何用Bootstrapping模式实现零成本启动与快速验证
  • stl每次遍历找最大值
  • ScaleLLM:基于向量化与编译技术的大模型推理引擎部署与优化指南
  • opencode会话同步skill
  • 【图像加密解密】3D-IWT和2D-ICSM超混沌的密文彩色图像加密解密【含Matlab源码 15420期】
  • Claude Skills 完全使用指南:从入门到自定义开发
  • AI代码生成:告别重复开发,效率翻倍
  • 面试被问 MySQL 慢 SQL 怎么排查?看完这篇直接给面试官讲明白
  • 项目介绍 基于Python的汉服商城管理系统设计与实现(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢
  • stm32f103编程手册英文版中,常用词汇生成英文短文学习
  • 2026国内葡萄牙移民中介五大排名:怎么选一个靠谱葡萄牙移民中介? - 速递信息
  • 量子计算中的对称保护拓扑序:理论与硬件实现
  • 宇树科技开放全球首个机器人应用商店,推动人形机器人迈向智能机时代
  • 2026年5月7日 AI发展对卫星通讯的影响及太空算力中心建设与发展深度研究
  • 字基网络芯片:让“成人的AI”走进物理世界 ——AGI芯片的终极范式革命
  • 数智赋能精准监测,合众思壮旗下吉欧电子亮相第八届工程监测技术大会 - 速递信息
  • 【视网膜病变】LBP检测糖尿病视网膜病变【含GUI Matlab源码 15421期】
  • 避坑指南:在Keil MDK中为STM32G4系列正确配置IQmathLib(解决常见链接错误)
  • 零基础学 Python 第一天|从环境搭建到基础语法,保姆级复盘
  • 16QAM调制与LO相位噪声的工程挑战与解决方案
  • 圣诞手势特效指挥 圣诞节交互魔法树项目源码
  • 单调有界定理等