我试图比较、MySql、和MS Server的基本插入性能。使用执行以下MSSQL查询需要1秒:
declare @i int
set @i=1
while (@i<1000)
begin
insert into empmast
(name) values ( 'Client ' + cast(@i as varchar(10) ))
set @i = @i + 1
end
goWorkBench中类似的查询需要40秒才能执行。以下是查询:
DELIMITER $$
DROP PROCEDURE IF EXISTS xproc_loop_test$$
CREATE PROCEDURE xproc_loop_test()
BEGIN
DECLARE int_val INT DEFAULT 0;
test_loop : LOOP
IF (int_val > 1000) THEN
LEAVE test_loop;
END IF;
SET int_val = int_val +1;
insert into empmast (name) values ( 'Client ' + int_val );
END LOOP;
END;这是否意味着MySQL在数据插入方面要慢得多?
发布于 2016-07-07 10:47:55
是的,不是的--我想这更多的是与何时和多久提交插入有关。例如,在以下(固定)版本的查询中,我在进入循环之前将autocommit设置为0 (off),并在循环结束后提交。在我的电脑上,执行时间由34秒缩短至0.25秒。
DROP PROCEDURE IF EXISTS xproc_loop_test;
DELIMITER $$
CREATE PROCEDURE xproc_loop_test()
BEGIN
DECLARE int_val INT DEFAULT 0;
set autocommit = 0;
test_loop : LOOP
IF (int_val > 998) THEN
LEAVE test_loop;
END IF;
SET int_val = int_val +1;
insert into empmast (name) values (concat( 'Client ' , int_val) );
END LOOP;
commit;
END $$;
delimiter ;发布于 2016-07-07 11:00:59
显然,对于这个用例,MySQL比Server慢得多。根据我的经验,MySQL通常比这快得多。而且,SQL Server通常比较慢。值得注意的是,我的MariaDB 10.0.x实例在这方面并不慢,需要32 my。
影响批量插入性能的因素很多。RDMS服务器在用户插入行时做了许多不可见的工作,例如构建BTREE索引和维护事务数据完整性。
从简单的测试用例(特别是顺序值)推断出关于性能的一般结论是不明智的。顺序值插入有时需要BTREE再平衡,这可能很费时。
在MySQL中,将插入循环封装在事务中会产生很大的性能差异。如下所示:
BEGIN TRANSACTION;
test_loop : LOOP
IF (int_val > 998) THEN
LEAVE test_loop;
END IF;
SET int_val = int_val +1;
insert into empmast (name) values (concat( 'Client ' , int_val) );
END LOOP;
COMMIT;为什么?因为您已经告诉MySQL,它可以构建一批记录,在一次执行中插入所有记录,并且可以一次性更新索引。
如果您使用一个程序来插入一百万行,那么通常明智的做法是将它们封装在每行几千行的事务中。
https://stackoverflow.com/questions/38242879
复制相似问题