黄东旭解析 TiDB 的核心优势
553
2023-04-16
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小时内删除侵权内容。