MySQL性能与MSSQL性能

MySQL性能与MSSQL性能,mysql,sql-server,Mysql,Sql Server,我试图比较MySql和mssqlserver的基本插入性能。使用Business Management studio执行以下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 go 这是否意味着MySQ

我试图比较MySqlmssqlserver的基本插入性能。使用Business Management studio执行以下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
go

这是否意味着MySQL在数据插入方面要慢得多?

是和否-我怀疑这更多地与何时以及多久提交一次插入有关。例如,在以下(固定)版本的查询中,我在进入循环之前将autocommit设置为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 ;

是和否-我怀疑这更多地与插入的时间和频率有关。例如,在以下(固定)版本的查询中,我在进入循环之前将autocommit设置为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 ;

显然,在这个用例中,MySQL比SQL Server慢得多。根据我的经验,MySQL通常比这快得多。而且,SQL Server通常速度较慢。值得一提的是,我的MariaDB 10.0.x实例在这方面并不慢,需要32毫秒

影响批量插入性能的因素很多。当用户插入行时,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,它可以建立一批记录,一次插入所有记录,并且它可以一次更新您的索引


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

显然MySQL在这个用例中比SQL Server慢得多。根据我的经验,MySQL通常比这快得多。而且,SQL Server通常速度较慢。值得一提的是,我的MariaDB 10.0.x实例在这方面并不慢,需要32毫秒

影响批量插入性能的因素很多。当用户插入行时,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,它可以建立一批记录,一次插入所有记录,并且它可以一次更新您的索引


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

为什么在一种情况下创建存储过程,而在另一种情况下只创建一个循环。拥有基本相同的代码不会给你一个更公平的结果吗?@jonny Mysql只允许在存储过程(和函数)中使用循环@P.Salmon Mysql花费更长时间的原因可能与存储过程也被编译有关。为什么你在一种情况下创建存储过程,而在另一种情况下只创建循环。基本上相同的代码不会给你一个更公平的结果吗?@jonny Mysql只允许存储过程(和函数)中的循环@P.Salmon Mysql花费更长时间的原因可能与存储过程也被编译有关。谢谢Salmon,开始吧。在所有的插入之后提交确实是一个显著的性能变化。但是请记住,在SQL server中,我不需要为终端设置提交。SQL server会为您执行此操作-这是mysql和SQL server之间的行为差异之一。谢谢Salmon,开始吧。在所有的插入之后提交确实是一个显著的性能变化。但请记住,在SQL server中,我不需要为end设置提交。SQL server会为您执行此操作—这是mysql和SQL server之间的行为差异之一。