不好的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 ;

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

时间: 2024-11-10 04:08:31

不好的MySQL过程编写习惯的相关文章

mysql存储过程编写-入门案例-遁地龙卷风

(-1)写在前面 这篇文章只是简要的叙述了mysql存储过程编写的基本概念. 我使用的mysql版本是5.7.9-log. 参照<<深入浅出MySQL>>. (0) delimiter // delimiter //中的//可以指定为别的符号,比如delimiter @@,改变语句的结束的标识. 因为在存储过程中用到了;,不改变默认语句结束.标识将会报错. 创建完存储过程后别忘了自己更改过默认结束标识哦! (1)存储过程的创建 在mysql命令行工具输入如下代码,当然你也可以在可视

Mysql存储过程编写

Mysql存储过程编写存储过程编写的模板:Create PROCEDURE PROCEDUREName (IN para mint,--)BeginDeclare varname type;语句:End;以上就是存储过程的编写模板.其中,type可以是表中的任意类型,比如:varchar,bigint,int,decimal,longtext等等类型.游标的声明是:Declare cursorName cursor from select语句.Declare continue handler f

MYSQL-重做系统恢复MYSQL过程

记笔记是好习惯,记笔记是好习惯,记笔记是好习惯! 重要的事情说三遍. 说多了都是泪.第一次装MYSQL时候就遇到了很多问题,当时解决了忘记记录了.家里硬盘满了,于是买了个4T的硬盘重装系统.重装系统后开始了开发环境重装.Anaconda3,pycharm,mongodb,pycharm... 到了mysql时候就遇到各种问题. 1.先把mysql-5.7.18-win32从H盘挪到D:\Program Files\mysql-5.7.18-win32. 2.建立配置文件D:\Program Fi

安装mysql过程

参考文档:http://www.cnblogs.com/LinuxSuDa/p/5994711.html 安装mysql-5.6.30.tar.gz 安装前检查是否有其他版本 [[email protected] /]# rpm -qa|grep mariadb mariadb-libs-5.5.52-1.el7.x86_64 [[email protected] /]# rpm -e mariadb-libs-5.5.52-1.el7.x86_64 错误:依赖检测失败: libmysqlcli

QT 5 配置MySQL 过程记录

配置过程记录一下,年纪大了记性很差-- 0 安装环境 Win10x64+Qt5.5(x86)+VS2010(x86) 1 安装MySQL 注意: 以下是按x64版本安装的,x86版本的安装流程没有区别. MySQL安装的版本应该与Qt的版本相对应,切记!切记! 1.1 下载 http://dev.mysql.com/downloads/mysql/ 选择 mysql-5.7.14-winx64.zip下载 1.2 解压 解压缩文件到安装目录 注意:不要在安装目录中保留空格 1.3 配置 (1)将

Ubuntu安装Mysql过程及远程问题解决

ubuntu下执行 sudo apt-get instlll mysql-server sudo apt-get install mysql-client 安装过程中会有文字界面设置密码 牢记密码 Mysql图形化工具绿色版 推荐 Mysql Workbench: https://yunpan.cn/cPSFXPvGEhh5v  访问密码 f31c Navicat for Mysql:(推荐) https://yunpan.cn/cPSFW83eSk9kU  访问密码 6317 本地连接 : m

MySql如何编写高效的SQL

最近应团队要求,研究整理了下,mysql相关的优化,有些是根据实际java项目中碰到的情况经验之谈.欢迎讨论~ SQL 语言是一种强大而且灵活的语言,在使用 SQL 语言来执行某个关系查询的时候,用户可以写出很多不同的 SQL 语句来获取相同的结果.也就是说,语法不同的SQL语句,有可能在语义上是完全相同的.但是尽管这些 SQL 语句最后都能返回同样的查询结果,它们执行所需要的时间却有可能差别很大. 一.优化目标 减少 IO 次数 IO永远是数据库最容易产生瓶颈的地方,这是由数据库的职责所决定的

CentOS 6.5 安装mysql 过程记录

下载的时候一定选对应的版本, el6 还是el7 或者其他版本,不然会出现意向不到的惊喜 比如:我刚开始的时候下载的 el7 版本的 mysql , 然后安装的时候 就会出现: libc.so.6(GLIBC_2.14)(64bit) is needed by MySQL-server-5.5.62-1.el7.x86_64 libc.so.6(GLIBC_2.17)(64bit) is needed by MySQL-server-5.5.62-1.el7.x86_64 然后我根据这个线索,去

CentOS7下安装Mysql失败经历--CentOS7使用yum安装和卸载Mysql过程

起因 自己租用的BandwagonVPS上安装了个CentOS7,然后开始安装各种软件,结果yum安装MySQL发现MySQL在yum源中的Mysql不对劲,于是自己百度搜索安装方法. 终于我搜到了这篇文章:http://www.mamicode.com/info-detail-503994.html,于是我就兴高采烈地安装了起来. 安装过程 我不建议这么安装,因为我经历的是一个失败的过程,最后我也卸载掉了. 下载mysql的repo源 注意这是社区版的mysql 我在/usr/local下面新