我正在尝试比较 MySql 和 MS SQL Server 的基本插入性能。以下MSSQL查询需要1秒才能使用Business Management studio执行:
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
go
WorkBench中的类似查询需要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的数据插入速度较慢?
答案 0 :(得分:1)
是和否 - 我怀疑它与插件的提交时间和频率有关。例如,在查询的以下(固定)版本中,我在进入循环之前将自动提交设置为0(关闭),并在循环终止后提交。在我的电脑上,这将执行时间从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 ;
答案 1 :(得分:1)
显然,对于这个用例,MySQL比SQL Server慢得多。根据我的经验,MySQL通常比这快得多。并且,SQL Server通常较慢。对于它的价值,我的MariaDB 10.0.x实例并不慢,耗时32ms。
许多因素会影响批量插入性能。当用户插入行时,RDMS服务器会执行大量不可见的工作,例如构建BTREE索引和维护事务数据完整性。
从简单的测试用例,特别是顺序值中推断,得出有关性能的一般结论是不明智的。顺序值插入有时可能需要BTREE重新平衡,这可能非常耗时。
在MySQL中,将插入循环包装在事务中会产生很大的性能差异。像这样:
AppleLanguages
为什么呢?因为你告诉MySQL它可以建立一批记录来一次性插入所有记录,它可以一次性更新你的索引。
如果您正在使用程序插入一百万行,那么将它们包装在每行数千行的事务中通常很聪明。