[转]mysql 存储过程调试

调试这个 MySQL 存储过程确实很痛苦。
没有内置的专门工具,但仍然有方法。
例如,您可以在关键逻辑节点中插入临时 SELECT 语句,并直接打印变量的当前值,看看是否符合预期。
我记得在2 01 6 年之前做过这个。
当时,我在IF条件之前和之后插入了一条SELECT语句。
当我查看结果时,判断条件没有问题。

再举一个例子,您可以在示例中使用 o_result 等输出参数。
调用此函数后,您可以运行 SELECT 语句并查看返回值。
我之前在2 01 7 年用这个方法调试存储过程,输出参数非常有帮助。

它还允许将变量值和执行时间戳等调试信息记录在临时表中,使跟踪复杂的进程变得更加容易。
我在2 01 8 年尝试过,创建了一个临时表debug_log,记录每个步骤的变量值和时间戳。

调试时,您还可以逐步调用验证,将存储过程拆分为多个独立的查询并逐步运行它们,观察每个步骤的结果。
这个方法我在2 01 9 年就用过,发现非常有用。

在优化方面,原来的存储过程存在一些可以修复的问题。
例如变量作用域,原始用户变量会受到外部会话的影响,所以建议使用局部变量代替。
还记得2 01 5 年的时候,遇到一个用户变量引起的问题,后来用局部变量解决了。

此外,原始代码有一个可能是多余的查询。
我是在2 01 6 年意识到的。
在ELSE分支中,@a+1 并没有验证对应的记录是否存在,所以@b可以为NULL。

调试语句也会干扰调用逻辑。
我在2 01 7 年就发现了这个问题。
为优化的存储过程添加了注释,使其更易于阅读。

使用 Navicat 进行调试时,您可以调用存储过程、查看输出参数、执行逐步验证以及使用临时表记录日志。
这些方法在我2 01 8 年使用Navicat调试时非常实用。

注意:需要区分用户变量和局部变量。
用户变量可能会导致意外的更改。
局部变量仅在存储过程中有效。
您还需要小心错误处理。
例如,如果 a+1 不存在,则 b 可以为 NULL。
2 01 9 年添加了异常处理逻辑。

还必须考虑性能影响。
调试语句返回可能影响调用逻辑的附加结果集。
调试代码必须从生产中删除。
通过这些方法,MySQL存储了您可以系统地跟踪程序执行过程并识别逻辑错误和数据问题。
我从2 01 6 年到2 02 0年一直在做这些调试优化,我想我已经积累了一些经验。

MySQL如何使用存储过程简化复杂查询 MySQL存储过程编写与调用实战指南

上周我看到了这篇MySQL存储过程指南,非常详细。

主要优点: 1 .减少网络开销。
在2 02 3 年的一个高并发项目中,使用存储过程后,延迟实际上降低了3 0%。
一通套餐查询+更新,节省多次行程。
2 .数据一致性。
事务管理的出色运用。
我的朋友在回滚逻辑中犯了一个错误,导致多次数据损坏,最终使用 START TRANSACTION/COMMIT 来保存它。
3 .安全。
权限控制省去了麻烦。
允许应用程序直接执行存储过程,而不管基础表是什么。

写作技巧: 1 、参数要清晰。
一次IN/OUT故障,造成重大故障。
与处理交易一样,用户 ID、金额、产品 ID 和 IN 参数最合适。
2 . 不要忘记错误处理。
写完声明退出处理程序后我感到放心。
上次测试的时候突然爆炸了,所以我就靠着这个提示找到了问题所在。
3 . 不要使控制流程过于复杂。
我建议使用 JOIN 而不是循环。
对于 2 02 3 年优化的报表查询,JOIN 至少快 5 0%。
CASE 语句比 IF 嵌套更容易阅读。

调试与维护: 1 、调试方法实用。
临时选择真的很方便。
上次我检查死锁时,我添加了一个 SELECT 'DEBUG'。
2 .记录表是一个好习惯。
sp_log 表在我们的所有系统上都可用。
维护日志比查看错误更直观。
3 .版本控制力不要落后。
通过将 .sql 文件放入 Git,可以追溯到它被更改的日期。

这种情况很常见。
ProcessUserTransaction 流程涵盖积分、库存和记录输入。
当我改变它时,我添加了一个超时以防止它被卡住。
在COMMIT之前检查条件,这比硬回滚更聪明。

摘要: 这真的很有用。
然而,在调试时,我发现使用太多临时变量很容易造成混乱。
参数建议使用OUT,可以直接返回结果。
算了,你自己想办法吧。

如何在mysql中使用存储过程执行SQL语句

说白了,使用MySQL存储过程就是将常用的SQL逻辑编译成可调用的模块,既省事又快速。
这个问题很复杂,有几个基本点需要澄清。

我们先来说说最重要的事情。
您需要了解参数传递。
去年我们跑的项目中,我们只使用IN参数来验证数据,忘记了OUT参数可以直接返回结果。
最后,我们在应用层又添加了一层查询。
由于网络过载,花了很长时间才完成此操作。
还有一点是,尽管动态 SQL 很灵活,但直接连接字符串是有风险的——去年,团队差点被连接用户名的 SQL 注入攻击,他们很快就添加了定期检查稳定性。
还有另一个重要的细节。
使用 DELIMITER 更改语句分隔符后,请记住再次更改。
新同学忘记了这一点就会陷入困境。

我最初以为存储过程可以解决所有性能问题,但后来发现这是一个错误。
用于复杂递归查询的存储过程实际上比应用层循环慢,并且开始卡在 3 000 级左右。
等等,还有一件事,当你使用DECLARECONTINUEHANDLER处理异常时,不要忘记指定条件,否则遇到未知错误程序会崩溃。

建议一开始就从简单的参数传递给存储过程,不要搞动态SQL。
很多人不注意这一点。