首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL性能与MSSQL性能

MySQL性能与MSSQL性能
EN

Stack Overflow用户
提问于 2016-07-07 10:12:27
回答 2查看 4.5K关注 0票数 0

我试图比较、MySql、MS Server的基本插入性能。使用执行以下MSSQL查询需要1秒:

代码语言:javascript
复制
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秒才能执行。以下是查询:

代码语言:javascript
复制
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在数据插入方面要慢得多?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-07 10:47:55

是的,不是的--我想这更多的是与何时和多久提交插入有关。例如,在以下(固定)版本的查询中,我在进入循环之前将autocommit设置为0 (off),并在循环结束后提交。在我的电脑上,执行时间由34秒缩短至0.25秒。

代码语言:javascript
复制
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 ;
票数 2
EN

Stack Overflow用户

发布于 2016-07-07 11:00:59

显然,对于这个用例,MySQL比Server慢得多。根据我的经验,MySQL通常比这快得多。而且,SQL Server通常比较慢。值得注意的是,我的MariaDB 10.0.x实例在这方面并不慢,需要32 my。

影响批量插入性能的因素很多。RDMS服务器在用户插入行时做了许多不可见的工作,例如构建BTREE索引和维护事务数据完整性。

从简单的测试用例(特别是顺序值)推断出关于性能的一般结论是不明智的。顺序值插入有时需要BTREE再平衡,这可能很费时。

在MySQL中,将插入循环封装在事务中会产生很大的性能差异。如下所示:

代码语言:javascript
复制
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,它可以构建一批记录,在一次执行中插入所有记录,并且可以一次性更新索引。

如果您使用一个程序来插入一百万行,那么通常明智的做法是将它们封装在每行几千行的事务中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38242879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档