讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

剧云
剧云

中文短剧剧本制作平台

AniShort
AniShort

AI短剧协同制作平台

updream

一键生成高质量推广成片

如何排查MySQL在执行存储过程时的编译与执行性能损耗

星辰同学_9299

星辰同学_9299

发布时间:2026-11-14 06:29:18

|

398人浏览过

|

来源于php中文网

原创

不是。MySQL存储过程无编译缓存,ALTER PROCEDURE仅更新元数据,不重建执行计划;变慢主因是优化器行为变化、统计信息陈旧或变量传参导致计划复用失效,须用EXPLAIN分析关键语句、ANALYZE TABLE更新统计、必要时用RECOMPILE提示或PREPARE动态执行。

如何排查mysql在执行存储过程时的编译与执行性能损耗

存储过程没有“编译缓存”,别白费劲 ALTER PROCEDURE

MySQL 存储过程不生成可执行二进制码,ALTER PROCEDURE 只更新元数据(比如注释、参数名),完全不会触发执行计划重建或优化器重评估。升级后变慢,不是因为“没重编译”,而是优化器行为变了、统计信息旧了、或者默认配置调整了。

常见错误现象:看到慢了就下意识 ALTER PROCEDURE xxx ...,再反复 CALL 测试,结果毫无改善;甚至误以为是“过程被缓存了旧计划”,试图杀连接清缓存——MySQL 没有存储过程级的计划缓存。

  • 真正影响首次调用性能的是语句解析 + 优化器决策,这部分开销在第一次执行时发生,之后复用的是单条 SQL 的查询计划(不是整个过程)
  • 若过程内含动态拼接(PREPARE/EXECUTE),每次都会重新解析,这才是真正的“重复编译”点
  • 检查是否真有编译类开销,可对比 SHOW PROFILE FOR QUERY N 中的 Creating sort index、executing 和 end 阶段耗时,而非盯着“parse”阶段

先看执行计划,再动参数:EXPLAIN 是唯一可信依据

存储过程里每条 SELECT、UPDATE、DELETE 都独立走优化器,执行计划可能因传入变量值不同而彻底改变。必须对过程内关键语句单独 EXPLAIN,不能只看 CALL 整体耗时。

使用场景:升级 MySQL 5.7 → 8.0 后,同一存储过程变慢,但 EXPLAIN 显示走了 HASH JOIN 或用了直方图估算,和之前 NESTED LOOP 完全不同。

  • 用 EXPLAIN FORMAT=TREE(8.0)或 EXPLAIN FORMAT=JSON(5.7+)看真实执行路径,重点关注 join_execution 和 used_columns
  • 在过程内模拟参数值:比如 SET @p_status = 'done'; SELECT ... WHERE status = @p_status;,再 EXPLAIN,避免被变量掩盖选择率
  • 临时关闭可疑特性验证影响:SET SESSION optimizer_switch='hash_join=off';,再 CALL 测试,确认是否是某开关导致计划劣化

统计信息陈旧是头号杀手,ANALYZE TABLE 必须手动跑

升级后最常被忽略的动作:没手动执行 ANALYZE TABLE。InnoDB 的统计信息不会自动刷新到足够精度,尤其当表数据量大、分布倾斜时,优化器会严重误判行数,导致选错索引、用错 JOIN 顺序——这对含多表关联的存储过程几乎是致命的。

win可用的mysql指令skill
win可用的mysql指令skill

安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。

下载

容易踩的坑:用 OPTIMIZE TABLE 代替 ANALYZE TABLE;或全库扫表执行 mysqlcheck --analyze,引发长锁阻塞业务。

  • 对存储过程中高频访问的表逐个执行:ANALYZE TABLE orders, customers, order_items;
  • 确认 innodb_stats_auto_recalc=ON(5.6.6+ 默认开启),但升级后首次仍需手动触发,否则优化器基于旧采样做决策
  • 低峰执行:5.7 中 ANALYZE TABLE 是阻塞操作;8.0+ 支持并发采样,但仍建议避开流量高峰

变量传参导致计划复用失效,小心“伪缓存”陷阱

MySQL 没有参数化嗅探(parameter sniffing),存储过程中用变量(如 WHERE status = p_status)时,优化器在**首次调用时基于该变量具体值**生成并缓存计划。后续即使传入高基数、低选择率的值,也继续复用那个“过时”的计划——看起来像缓存,实则是隐患。

典型表现:第一次传 p_status = 'pending'(10% 行),走了索引;第二次传 p_status = 'done'(95% 行),还硬走索引,全表扫描都比它快。

  • 强制重生成计划:在关键查询前加 SELECT /*+ RECOMPILE */ ...(8.0.22+);或改用 PREPARE/EXECUTE 动态构造语句(注意注入风险)
  • 更稳妥做法:把高频变化的条件拆成多个专用过程,或用 CASE WHEN 在 SQL 内部分支,让优化器能为各分支生成不同计划
  • 监控是否中招:查 performance_schema.events_statements_summary_by_digest,看同一 digest 的 avg_timer_wait 是否波动极大

真正卡住性能的,往往不是语法写得有多错,而是统计信息滞后、执行计划固化、变量值误导这三者叠加。动手前先 EXPLAIN 关键语句,再 ANALYZE TABLE,最后看变量怎么传——顺序错了,调一天也白搭。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4983

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1011

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1309

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

7041

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3703

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

7020

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

9821

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1330

2024.04.29

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn