MySQL中Sp运行Check表版本更新流程解析

网友投稿 553 2023-04-16

MySQL中Sp运行Check表版本更新流程解析

MySQL中Sp运行Check表版本更新流程解析

一、MySQL的sp运行sql语句两个步骤介绍

MySQL的sp运行SQL语句需要执行2个步骤:prepare和execute。第一次执行的时候先执行prepare,进行相关语句parse、itemize、fix_fields等操作,然后才开始进行execute操作。等第二次再执行该sp的时候就直接运行execute而不需要再次进行重复的prepare操作,这样可以节省sp运行时候重复prepare的开销。但是,对于表操作就有一个问题产生,那就是如果执行第二遍的时候表的结构发生改变了,那么不进行reprepare而直接execute是会发生错误的。因此,本文章的目的在于寻找sp多次运行时候如何确认表版本更新并进行正确的操作。

先看下面的例子:CREATE TABLE t1 (a INT, b VARCHAR(10));INSERT INTO t1 VALUES (1,'11');INSERT INTO t1 VALUES (2,'21');MySQL> select * from t1;+------+------+| a | b |+------+------+| 1 | 11 || 2 | 21 |+------+------+2 rows in set (0.01 sec)DELIMITER $$CREATE PROCEDURE p1()BEGINupdate t1 set b='aa' where a=1;END $$DELIMITER ;MySQL> call p1; #这里第一次操作,因此会先执行update这句SQL的prepare再进行execute。Query OK, 1 row affected (0.05 sec)MySQL> select * from t1;+------+------+| a | b |+------+------+| 1 | aa || 2 | 21 |+------+------+2 rows in set (0.01 sec)MySQL> call p1; #这里第二次操作,直接执行update这句SQL的execute。Query OK, 0 rows affected (13.78 sec)#接着我们执行表结构的更新。MySQL> alter table t1 add i int;Query OK, 0 rows affected (0.41 sec)Records: 0 Duplicates: 0 Warnings: 0#然后再次执行sp,就会发现这次执行了这句SQL的prepare再进行execute。MySQL> call p1;Query OK, 0 rows affected (34.24 sec)

二、代码跟踪

现在跟踪一下这个sp看看上面在哪里check表版本并且能正确执行reprepare的。

三、知识应用

如果想开发一种动态表类型,需要每次执行sp都重新parse这个表,那就可以借用这个ask_to_reprepare函数来保证多次执行sp的时候都会进行重新reprepare。

四、总结

在MySQL的sp操作中涉及表操作的sql语句一定会执行check_and_update_table_version这个函数,每次会根据这个函数的结果来确定要不要重新parse该sql语句,如果没有版本改变就直接进行execute操作,如果有改变就重新parse,先prepare再execute,这样可以保证每次执行sp的SQL语句的时候表结构一定是最新的。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MySQL事务详解
下一篇:PG数据库服务器的CPU使用率突然升高该如何分析
相关文章