Chinaunix首页 | 论坛 | 博客
  • 博客访问: 447267
  • 博文数量: 135
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 1145
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-13 17:16
文章分类

全部博文(135)

文章存档

2011年(5)

2010年(4)

2009年(26)

2008年(25)

2007年(29)

2006年(42)

2005年(4)

分类: Mysql/postgreSQL

2009-07-16 15:17:49

Mysql Version:
mysql> select version();
+----------------+
| version()      |
+----------------+
| 5.4.1-beta-log |
+----------------+
1 row in set (0.00 sec)
 
看到杨涛同学的这篇文章,试了一下。
DROP TABLE IF EXISTS `test`.`users`;
CREATE TABLE  `test`.`users` (
  `uuid_id` varchar(46) CHARACTER SET latin1 DEFAULT NULL,
  `uuid_left` varchar(46) CHARACTER SET latin1 DEFAULT NULL,
  `uuid_all` varchar(46) CHARACTER SET latin1 DEFAULT NULL,
  `other` varchar(46) CHARACTER SET latin1 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
 
mysql> show create procedure pro_addusers\G
*************************** 1. row ***************************
       Procedure: pro_addusers
        sql_mode:
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `pro_addusers`(userconut int)
begin
  set @i = 0;
  repeat set @i = @i + 1;
  insert into users values (@var:=replace(uuid(),'-',''),left(@var,10),@var,'abcdefghijglmn');
  until @i = userconut end repeat;
end
1 row in set (0.00 sec)


mysql> show create procedure pro_addusers\G
*************************** 1. row ***************************
       Procedure: pro_addusers
        sql_mode:
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `pro_addusers`(userconut int)
begin
  set autocommit=0;
  set @i = 0;
  repeat set @i = @i + 1;
  insert into users values (@var:=replace(uuid(),'-',''),left(@var,10),@var,'abcdefghijglmn');
  if @i%1000=0 then commit;
  end if;
  until @i = userconut end repeat;
end
1 row in set (0.00 sec)

上面两个存储过程,向同一个INNODB表插入同样的数据量,时间差两个数量级。
插入10万条记录,前者10分钟,后者1秒钟。
所以对INNODB表批量处理数据的时候,最好不要用自动提交。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
但测试结果第一个需要超长时间等待!
mysql> call pro_adduser(100000);
Query OK, 1 row affected (56 min 28.77 sec)
 
测试第二个需要测得的结果跟上面的差不多?(如果不关闭 set autocommit=off;)
mysql> call pro_adduser(100000);
Query OK, 0 rows affected (20.75 sec)
 
这样才OK!

 
阅读(400) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~