簡體   English   中英

MySQL性能與MSSQL性能

[英]MySQL Performance vs MSSQL Performance

我正在嘗試比較MySqlMS 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的數據插入速度會變慢?

是和否-我懷疑這與插入內容的提交時間和頻率有關。 例如,在以下查詢的(固定)版本中,我在進入循環之前將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實例而言,這樣做並不慢,花費了32ms。

許多因素都會影響批量插入的性能。 當用戶插入行時,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,它可以建立一批記錄以一次性插入所有記錄,並且可以一次更新索引。

如果您正在使用程序插入一百萬行,將它們包裝在每個數千行的事務中通常很聰明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM