mySQL 连续INSERT怎么这么慢?

hyrongg 2008-03-11 03:44:27
DELIMITER $$

DROP PROCEDURE IF EXISTS 'doloop`$$
CREATE DEFINER=`mysql`@`%` PROCEDURE doloop`()
BEGIN
DECLARE v INT default 10000;
WHILE v > 0 DO
insert into t values(v);
SET v = v - 1;
END WHILE;
END $$

DELIMITER ;

上面是一个简单的PROCEDURE,连续INSERT 10000 条记录到一个简单
表T(IDX INTEGER)

CALL DOLOOP;
要等一分多钟,MS-SQL只要9秒,怎么会事?

当家帮忙看看,谢谢!

...全文
360 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
懒得去死 2008-03-19
  • 打赏
  • 举报
回复
看我的测试。MYSQL 一秒都不到。


mysql> create table t (num int not null) engine myisam;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE PROCEDURE `doloop`()
-> BEGIN
-> DECLARE v INT default 10000;
-> WHILE v > 0 DO
-> insert into t values(v);
-> SET v = v - 1;
-> END WHILE;
-> END$$
Query OK, 0 rows affected (0.01 sec)

mysql>
mysql> DELIMITER ;
mysql>
mysql> call doloop();
Query OK, 1 row affected (0.42 sec)

mysql> select count(*) from t;
+----------+
| count(*) |
+----------+
| 10000 |
+----------+
1 row in set (0.00 sec)

mysql>

懒得去死 2008-03-19
  • 打赏
  • 举报
回复
还有,如果你想要你自己的存储过程来实现批量插入,建议改变表引擎为MYISAM,而且屏蔽掉索引信息。这样插入速度简直就是天和地的区别!
faisun 2008-03-18
  • 打赏
  • 举报
回复

mysql> delimiter $;
mysql> drop procedure doloop;

mysql> create procedure doloop(in v int(11))
-> BEGIN
-> truncate table t;
-> while v>0 do
-> insert into t values (v);
-> set v = v-1;
-> end while;
-> end $;

mysql> delimiter ;

mysql> call doloop(100000);
Query OK, 1 row affected (2.42 sec)

mysql> select count(*) from t;
+----------+
| count(*) |
+----------+
| 100000 |
+----------+
1 row in set (0.00 sec)

faisun 2008-03-18
  • 打赏
  • 举报
回复
mysql> delimiter $;
mysql> create procedure doloop()
-> begin declare v int default 10000;
-> while v>0 do
-> insert into t values(v);
-> set v=v-1;
-> end while;
-> end $;

mysql> delimiter ;

mysql> call doloop;
Query OK, 1 row affected (0.31 sec)

mysql> select count(*) from t;
+----------+
| count(*) |
+----------+
| 10000 |
+----------+
1 row in set (0.00 sec)

------------------------------------
不是吧, 我才 0.31 秒,你什么机器啊....
xbt746 2008-03-18
  • 打赏
  • 举报
回复
改用事务
begin
commit试哈
懒得去死 2008-03-11
  • 打赏
  • 举报
回复
给你的例子为什么你就不看呢?
修改一下就可以测试了嘛!!!

DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`sp_insert_batch`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_insert_batch`(IN number int(11))
BEGIN
declare i int(11);
set i = 1;
-- such as 1-2000,2000-4000,....
WHILE i <= number DO
if mod(i,2000)=1 then
set @sqltext =concat('(',i,')');
elseif mod(i,2000)=0 then
set @sqltext=concat(@sqltext,',(',i,')');
set @sqltext=concat('insert into t values',@sqltext);
prepare stmt from @sqltext;
execute stmt;
DEALLOCATE PREPARE stmt;
set @sqltext='';
else
set @sqltext=concat(@sqltext,',(',i,')');
end if;
set i = i + 1;
END WHILE;
-- process when number is not be moded by 2000
-- such as 2001,4002,15200,...
if @sqltext<>'' then
set @sqltext=concat('insert into t values',@sqltext);
prepare stmt from @sqltext;
execute stmt;
DEALLOCATE PREPARE stmt;
set @sqltext='';
end if;
END$$

DELIMITER ;






表结构:

Table Create Table
------ --------------------------------------
t CREATE TABLE `t` (
`id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
测试结果 :

mysql> call sp_insert_batch(10000);
Query OK, 0 rows affected (0.61 sec)
mysql> select count(*) from t;
+----------+
| count(*) |
+----------+
| 10000 |
+----------+
1 row in set (0.00 sec)

yifuzhiming 2008-03-11
  • 打赏
  • 举报
回复
你用程序插入试试撒,不会这么慢的
hyrongg 2008-03-11
  • 打赏
  • 举报
回复
关键问题,我是要比较MS-SERVER和MYSQL的插入速度,因为都说MYSQL速度比较快,
所以打算用MYSQL,但同一机器上,都是一条一条的INSERT,MS-SQL比MYSQL快的太多了,
简直不能相信,是不是我的MYSQL SCRIPT写的有问题?

谢谢大家.
懒得去死 2008-03-11
  • 打赏
  • 举报
回复

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧