SQL 线上慢查询的排查流程

发布时间 - 2026-01-25 00:00:00    点击率:
MySQL默认不开启慢查询日志,需检查slow_query_log是否为ON、long_query_time阈值是否合理,并确认log_output方式及日志路径或表位置。

怎么看慢查询日志是否开启

MySQL 默认不开启慢查询日志,得先确认配置是否生效。关键看两个系统变量:slow_query_loglong_query_time。前者必须为 ON,后者决定“慢”的阈值(单位秒,支持小数,比如 0.5 表示超过 500ms 就记)。

实操建议:

  • SHOW VARIABLES LIKE 'slow_query_log'SHOW VARIABLES LIKE 'long_query_time' 直接查当前值
  • 线上环境别直接改 SET GLOBAL slow_query_log = ON,优先走配置文件(my.cnf),避免重启失效

    或误操作
  • 注意 log_output 的值:如果设成 FILE,日志写磁盘,路径由 slow_query_log_file 指定;设成 TABLE 则写入 mysql.slow_log 表——后者方便 SQL 查询分析,但有性能开销,不建议长期开启

如何定位具体是哪条 SQL 在拖慢服务

慢查询日志本身只记录执行时间超限的语句,但缺乏上下文。光看 SQL 文本容易误判,比如同一条 SELECT * FROM orders WHERE user_id = ?,参数不同可能走不同索引、甚至全表扫描。

实操建议:

  • 启用 log_queries_not_using_indexes(谨慎!高并发下日志量爆炸),能抓到没走索引的查询,但别长期开着
  • 配合 pt-query-digest 工具解析慢日志:pt-query-digest /var/lib/mysql/slow.log,它会自动聚合、排序、给出执行次数、平均时间、锁等待等维度
  • 重点看 Rows_examinedRows_sent 的比值——如果查了 10 万行只返回 1 行,大概率缺索引或条件没打在索引列上

EXPLAIN 看懂了但还是不会优化

EXPLAIN 输出里最需盯紧三列:type(访问类型)、key(实际用的索引)、Extra(额外动作)。常见陷阱不是看不懂字段,而是忽略隐式转换和索引失效场景。

实操建议:

  • type 出现 ALLindex 基本等于全表/全索引扫描,优先检查 WHERE 条件是否用了函数(如 WHERE DATE(create_time) = '2025-01-01')、或者对索引列做了运算(WHERE id + 1 = 100
  • key 为空但 possible_keys 有值?说明优化器认为走索引不如全扫——可能是因为数据分布倾斜(比如某值占 90%),也可能是统计信息过期,可手动执行 ANALYZE TABLE table_name
  • Extra 里出现 Using filesortUsing temporary,意味着排序或分组没走索引,要检查 ORDER BYGROUP BY 字段是否包含在联合索引最左前缀中

加了索引查询还是慢,为什么

索引不是银弹。尤其在线上高频更新的表上,索引越多,写放大越严重,而且 MySQL 对联合索引的匹配有严格顺序要求。

实操建议:

  • 避免给低区分度字段建索引(如 status 只有 0/1,加索引基本无效)
  • 联合索引字段顺序必须匹配查询模式:INDEX(a,b,c) 能加速 WHERE a=1 AND b=2,但对 WHERE b=2 无效;如果常查 b 单独条件,得另建索引
  • 注意索引长度限制:InnoDB 单索引长度上限约 767 字节(utf8mb4 下约 191 个字符),VARCHAR(500) 字段直接建索引会截断,导致查询时无法命中
  • 上线前务必在从库或影子库跑 EXPLAIN FORMAT=JSON,看 used_columnskey_parts 是否符合预期——生产环境优化器行为可能和测试库不一致

真实线上慢查往往卡在“以为优化到位了”那一步:索引建了、EXPLAIN 看着没问题、QPS 也稳,但某天突然响应毛刺。这时候得回头再核对 Rows_examined 增长趋势、检查是否有未被慢日志捕获的短时尖峰查询(long_query_time 设太高)、或者应用层批量请求触发了锁竞争。


# mysql  # js  # json  # 字节  # 工具  # ai  # 配置文件  # 隐式转换  # 为什么  # sql  # select  # date  # format  # using  # var  # 并发  # table  # 线上  # 看着  # 是因为  # 执行时间  # 不开启  # 用了  # 越多  # 但对  # 太高  # 开着 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Bootstrap整体框架之JavaScript插件架构  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  Laravel怎么在Controller之外的地方验证数据  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  如何在万网自助建站平台快速创建网站?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  简单实现Android验证码  Mybatis 中的insertOrUpdate操作  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  网站制作报价单模板图片,小松挖机官方网站报价?  JavaScript中的标签模板是什么_它如何扩展字符串功能  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  如何彻底卸载建站之星软件?  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  动图在线制作网站有哪些,滑动动图图集怎么做?  Laravel如何使用查询构建器?(Query Builder高级用法)  移动端脚本框架Hammer.js  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  Laravel如何使用Vite进行前端资源打包?(配置示例)  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  详解Huffman编码算法之Java实现  nginx修改上传文件大小限制的方法  如何自定义建站之星网站的导航菜单样式?  大同网页,大同瑞慈医院官网?  微信小程序 scroll-view组件实现列表页实例代码  如何在建站主机中优化服务器配置?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Laravel API资源类怎么用_Laravel API Resource数据转换  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  高防服务器:AI智能防御DDoS攻击与数据安全保障  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Linux系统运维自动化项目教程_Ansible批量管理实战  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  JS碰撞运动实现方法详解  魔方云NAT建站如何实现端口转发?  如何选择PHP开源工具快速搭建网站?  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  Laravel如何配置和使用缓存?(Redis代码示例)  高防服务器如何保障网站安全无虞?  如何构建满足综合性能需求的优质建站方案?  香港服务器部署网站为何提示未备案?