不好的MySQL过程编写习惯

   链接:http://blog.csdn.net/uncle_six/article/details/50278461


    刚才为了测试一个东西,写了个存储过程:  

    

复制代码
delimiter $$

drop procedure if exists sp_test$$

create procedure sp_test()
begin
  declare v_cnt int;
  set v_cnt = 0;
  while v_cnt < 100000
  do
    insert into t1 select v_cnt, v_cnt+1, v_cnt+2, v_cnt+3;
    set v_cnt = v_cnt + 1;
  end while; 
end $$

delimiter ;
复制代码

     很简单的一个过程,想要给表里插入10万条数据而已,但是实际执行过程中发现耗时很长,五分钟过去了还是没有执行完毕,于是我就把过程停掉了。又看了一遍过程我发现自己犯了一个曾经反复和别人强调过的错误,这种插入数据的过程,一定不要在循环中提交事务。MySQL默认是自动提交事务的,这一点众所周知,于是我的过程里每一条插入结束后都会自动将数据提交,于是每次提交都会写一次redo,于是我这个要写10万次redo,这个开销实在是很大很大的,于是我将过程做了简单的修改:

     

复制代码
delimiter $$

drop procedure if exists sp_test$$

create procedure sp_test()
begin
  declare v_cnt int;
  set v_cnt = 0;
  start transaction;
  while v_cnt < 100000
  do
    insert into t1 select v_cnt, v_cnt+1, v_cnt+2, v_cnt+3;
    set v_cnt = v_cnt + 1;
  end while; 
  commit;
end $$

delimiter ;
复制代码

     

     效果非常好。顺便说一句,头一次写的那个过程还有一个问题,比如说我刚才不耐烦的将terminal关掉了,但是我根本不知道我关掉的时候过程执行到哪里去了,比如我们有时候执行的时候发生了什么不可预知的错误,那么我们也就不知道现在执行到什么位置了。因此不要在循环中自动提交事务,要显式的开启事务。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值