面试官突然问我MySQL存储过程,我竟然连基础都不会!(详细)

需要明确的是,MySQL存储过程是封装的SQL代码块,编译后会长期使用。
适合复杂逻辑和批量操作。

扩展的要点就是这三点。
首先我们来说说最重要的事情——性能优化。
去年我们做那个电商项目,直接把QPS 5 00拉到2 000,用存储过程排序子表查询。
用行话来说,这称为预编译缓存输出。
事实上,SQL语句被编译一次,后续调用时可以直接使用,节省了重复解析的工作量。
还有一点——参数、输入输出参数的传递使得流程更加灵活。
例如,将用户ID传递给特定的统计函数,可以直接传递,无需编写Java代码循环SQL。
还有一个关键细节——事务控制。
存储过程中完整的初始化事务/提交/回滚避免了碎片代码中到处写事务的问题,尤其是在高动态场景下。

起初我以为存储过程可以解决所有问题,但后来我发现有些不对劲。
例如,维护不善是真实存在的,代码太深,不像圣经。
去年,我重新创建了 3 年前的旧流程,花了两天时间才修复逻辑。

最后提醒:使用指针时不要忘记设置取数限制,否则运行大量数据时CPU会爆炸。

mysql 存储过程

前两天在调试一个旧项目时遇到了一个奇怪的问题。
后台日志中有一堆错误,表示某个存储过程已超时。
我刚接手,对旧制度不是很熟悉。
打开数据库客户端,连接,发现存储过程确实相当复杂,有三层嵌套循环,还有临时表。
然后我想如果我用Java写这个,大概要花半天时间。
幸运的是它是 MySQL,所以快速搜索一下文档。
嘿嘿,我居然在手册里找到了创建存储过程的格式。
我记得最清楚的是DELIMITER。
之前改一个存储过程的时候,没有注意改回来。
结果,整个数据库被作为SQL语句执行。
我差点尿死了。

如何在mysql中备份存储过程和函数

上周,我的朋友在 MySQL 数据库中备份了存储过程和函数。
使用 mysqldump 工具添加了 --routines 参数,以确保备份所需的所有内容。
命令是这样的:mysqldump -u 用户名 -p --routines --databases 数据库名> backup.sql。
请记住,--dev stuff 键告诉 mysqldump 备份存储过程和函数。

然后如果他想单独转储没有表数据的存储过程和函数,他使用这个命令:mysqldump -u username -p --routines --no-create-db --no-data --databases 数据库名称>routines_only.sql。
这里, --no-create-db 和 --no-data 是关键,确保只备份逻辑对象。

关于权限,用户必须确保自己拥有适当的权限。
在 MySQL 5 .7 之前,用户应该能够选择 mysql.proc 表。
建议在 5 .7 及以上版本使用 SHOWROUTINE 许可证。
要授予权限,请使用 show me 命令:GRANT SHOWROUTINE。
'用户名'@'主机';泄密权。

恢复后,用mysql命令导入备份文件:mysql -u username -p < backup>请注意,目标数据库必须首先存在,或者备份文件必须有 CREATEDATABASE 语句。
它还提醒我,存储过程和函数的语法必须兼容当前版本的MySQL。

总结要点: 所需措施——定期进行许可证检查、动态备份和恢复后验证。
他告诉我,通过这些步骤,可以高效、可靠地备份和恢复MySQL存储过程和函数。
顺便说一句,如果备份时要求正常数据无法读取,则应确保用户的权限完整。
算了,你都知道的。