MySQL性能与MSSQL性能

时间:2016-07-07 10:12:28

标签: mysql sql-server

我正在尝试比较 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的数据插入速度较慢?

2 个答案:

答案 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它可以建立一批记录来一次性插入所有记录,它可以一次性更新你的索引。

如果您正在使用程序插入一百万行,那么将它们包装在每行数千行的事务中通常很聪明。