[英]MySQL Performance vs MSSQL Performance
我正在嘗試比較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的數據插入速度會變慢?
是和否-我懷疑這與插入內容的提交時間和頻率有關。 例如,在以下查詢的(固定)版本中,我在進入循環之前將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.