MySQL中sp运行check表版本更新流程解析

目录

  • MySQL的sp运行SQL语句两个步骤介绍
  • 代码跟踪
  • 知识应用
  • 总结

一、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() BEGIN update 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)