1、过程实例
BEGIN
SET @createTable = CONCAT('create table table_one_',DATE_FORMAT(DATE_SUB(CURRENT_TIMESTAMP,INTERVAL 1 DAY),'%Y%m%d'),' like table_one');
SET @insertData = CONCAT('insert into table_one_',DATE_FORMAT(DATE_SUB(CURRENT_TIMESTAMP,INTERVAL 1 DAY),'%Y%m%d'),' select * from table_one');
SET @dropTable= CONCAT(' drop table_one_', DATE_FORMAT(DATE_SUB(CURRENT_TIMESTAMP,INTERVAL 7 DAY),'%Y%m%d'));
SET @time = unix_timestamp(CONCAT( DATE_FORMAT(DATE_SUB(CURRENT_TIMESTAMP,INTERVAL 1 DAY),'%Y%m%d'),'000000'));
PREPARE stmt1 FROM @createTable ;
EXECUTE stmt1 ;
PREPARE stmt2 FROM @insertData ;
EXECUTE stmt2 ;
PREPARE stmt3 FROM @dropTable ;
EXECUTE stmt3 ;
TRUNCATE table table_one;
INSERT INTO adp_web_city_count_his(city,labels,counts,input_time) (SELECT a.city,a.labels,a.counts,@time from (SELECT * from adp_web_city_count)a);
INSERT INTO adp_web_total_count_his(labels,counts,input_time) (SELECT a.labels,a.counts,@time from (select * from adp_web_total_count)a);
END
2、字段解析: contact: 拼接字符串, date_format():格式化时间,这个存储过程的功能就是备份表,备份七天,删除7以前的数据
3、prepare:
Prepare SQL产生的原因。首先从mysql服务器执行sql的过程开始讲起,SQL执行过程包括以下阶段 词法分析->语法分析->语义分析->执行计划优化->执行。词法分析->语法分析这两个阶段我们称之为硬解析。词法分析识别sql中每个词,语法分析解析SQL语句是否符合sql语法,并得到一棵语法树(Lex)。对于只是参数不同,其他均相同的sql,它们执行时间不同但硬解析的时间是相同的。而同一SQL随着查询数据的变化,多次查询执行时间可能不同,但硬解析的时间是不变的。对于sql执行时间较短,sql硬解析的时间占总执行时间的比率越高。而对于淘宝应用的绝大多数事务型SQL,查询都会走索引,执行时间都比较短。因此淘宝应用db sql硬解析占的比重较大。
1) Prepare 接收客户端带”?”的sql, 硬解析得到语法树(stmt->Lex), 缓存在线程所在的preparestatement cache中。此cache是一个HASH MAP. Key为stmt->id. 然后返回客户端stmt->id等信息。
2) Execute 接收客户端stmt->id和参数等信息。注意这里客户端不需要再发sql过来。服务器根据stmt->id在preparestatement cache中查找得到硬解析后的stmt, 并设置参数,就可以继续后面的优化和执行了。
Prepare在execute阶段可以节省硬解析的时间。如果sql只执行一次,且以prepare的方式执行,那么sql执行需两次与服务器交互(Prepare和execute), 而以普通(非prepare)方式,只需要一次交互。这样使用prepare带来额外的网络开销,可能得不偿失。我们再来看同一sql执行多次的情况,比如以prepare方式执行10次,那么只需要一次硬解析。这时候 额外的网络开销就显得微乎其微了。因此prepare适用于频繁执行的SQL。
Prepare的另一个作用是防止sql注入,不过这个是在客户端jdbc通过转义实现的,跟服务器没有关系。