博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
不好的MySQL过程编写习惯
阅读量:6292 次
发布时间:2019-06-22

本文共 932 字,大约阅读时间需要 3 分钟。

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

    

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关掉了,但是我根本不知道我关掉的时候过程执行到哪里去了,比如我们有时候执行的时候发生了什么不可预知的错误,那么我们也就不知道现在执行到什么位置了。因此不要在循环中自动提交事务,要显式的开启事务。

转载地址:http://hgzta.baihongyu.com/

你可能感兴趣的文章
mysql常用语法
查看>>
Morris ajax
查看>>
【Docker学习笔记(四)】通过Nginx镜像快速搭建静态网站
查看>>
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
查看>>
<转>云主机配置OpenStack使用spice的方法
查看>>
java jvm GC 各个区内存参数设置
查看>>
[使用帮助] PHPCMS V9内容模块PC标签调用说明
查看>>
关于FreeBSD的CVSROOT的配置
查看>>
基于RBAC权限管理
查看>>
数学公式的英语读法
查看>>
留德十年
查看>>
迷人的卡耐基说话术
查看>>
PHP导出table为xls出现乱码解决方法
查看>>
PHP问题 —— 丢失SESSION
查看>>
Java中Object类的equals()和hashCode()方法深入解析
查看>>
数据库
查看>>
Vue------第二天(计算属性、侦听器、绑定Class、绑定Style)
查看>>
dojo.mixin(混合进)、dojo.extend、dojo.declare
查看>>
Python 数据类型
查看>>
iOS--环信集成并修改头像和昵称(需要自己的服务器)
查看>>