1.prepare stmt from xxx; //用于 词法分析->语法分析->语义分析 生成一棵语法树(Lex)
2.execute stmt //执行sql
3.deallocate prepare stmt; //清除mysql服务器内存中这颗语法树所占用内存。说白了,清除第1步。
prepare 的目的,用于节省 词法分析->语法分析->语义分析 所占用的时间,因为每句普通的sql,比如 select xxx 或者 insert into xxx 都是要进行这些过程的。重复执行,而参数不同,没必要再各种解析的。
所以,要能发挥预处理的功能要如下写:
prepare stmt from 'insert into tab1 values ?'
SET @a = "(1,2,3)";
execute stmt using @a;
SET @a = "(4,5,6)";
execute stmt using @a;
。。。
等insert into 都执行完,再执行
deallocate prepare stmt;
prepare实际使用方式,以及实际使用效果
对于prepare的处理初衷还是考虑协议的兼容和简化处理逻辑,对于client->proxy->mysql这样接口来说,client->proxy是prepare协议,proxy->mysql是文本协议,所以整体来看在gaea环境下使用prepare性能提升有限,还是建议直接使用sql。
mysql中prepare的设计_prepare的设计与实现_蛋蛋科查尔的博客-优快云博客
prepare执行的过程: