• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

糟糕的MySQL过程编写习惯_mysql

mysql 搞代码 7年前 (2018-06-07) 130次浏览 已收录 0个评论

不好的mysql过程编写习惯

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

    

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 ;

     糟糕的MySQL过程编写习惯_mysql

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

欢迎大家阅读《糟糕的MySQL过程编写习惯_mysql》,跪求各位点评,by 搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:糟糕的MySQL过程编写习惯_mysql

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址