2012-02-16 22 views
3

我正在做一個小測試。下面的代碼運行3個隨機查詢1000倍(針對一個InnoDB表):運行3個DB查詢1k次的事務處理速度比事務處理快兩倍。正確?

delimiter // 
create procedure dtest() 
begin 
declare v_max int; 
declare v_counter int default 0; 
declare holder int; 
set v_max = 1000; 
    truncate table user; 

    start transaction; 

    while v_counter < v_max do 
    # random query 
    insert into user (username) values (CONCAT("user", floor(0 + (rand() * 65535)))); 
    select count(*) from user into holder; 
    select count(*) from user where username = 'user' into holder; 
    set v_counter = v_counter + 1; 
    end while; 

    commit; 

end // 

我除去這兩個語句跑上面的代碼與在start transaction;commit;,然後再次。

這個想法是我想看看它的運行速度是否比定義的事務慢。

我發現的是,第一個測試start transaction/commit測試在7秒內運行。當我刪除start transaction/commit查詢然後運行約15秒!

這是一個比我預期的更大的差異。我不知道有什麼我不瞭解的東西嗎?

回答

1

在這種情況下,簡單的答案是,寫入組合允許查詢週期結果的合併INSERT更快地點擊磁盤,而不是單個查詢。

不是那麼簡單的答案,這很大程度上取決於您的硬件和操作系統 - 例如,帶有最先進固態硬盤(預裝CPU限制)的英特爾凌動處理器會有不同的反應,而不是具有5400rpm磁盤的i7(可能是磁盤驅動器)。

此外,這很大程度上取決於您的併發性:在您的實驗中,沒有涉及併發,這是事務的最佳情況。從100個線程重試並行可能會給你不同的結果。

0

不是一般的。它可以是任何因素。沒有規定插入無交易正好慢了2倍。

該因子(在本例中爲2)來自事實,即如果您使用事務,則所有插入一次完成。當然還有很多其他因素,只是爲了處理複雜(如索引)。