2012-02-16 9 views
3

私は小さなテストをしています。 3つのDBクエリを1k回実行すると、トランザクションでは2回のクエリが実行されます。正しい?

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;で上記のコードを実行し、次のコードは1000倍(のInnoDBテーブルに対して)3つの、ランダムなクエリを実行します。

私は、それが定義されていないトランザクションよりも遅く実行されているかどうかを確認したいと考えていました。

私が見つけたのは、最初のテストstart transaction/commitで、テストは約7秒で実行されたことでした。 start transaction/commitを削除すると、クエリは〜15秒後に実行されます。

これは予想以上に大きな違いでした。私は理解していないものがあるのだろうか?

答えて

1

この場合の簡単な答えは、クエリのサイクルの結果であるINSERTの結合が、単一のクエリより速くディスクをヒットすることを可能にすることです。

それほど簡単な答えは、ハードウェアとOSに大きく依存するということです。最先端のSSDを搭載したIntel Atom(前提条件のCPUバウンド)は、i7と5400rpmディスク(おそらくディスクにバインドされている)とは異なる反応をします。

さらに、これは並行性に大きく左右されます。実験では、並行処理が行われていないため、トランザクションに最適です。パラレルで100スレッドから再試行すると、結果が異なる場合があります。

0

genralには存在しません。それはどんな要因でもあり得る。 w/oトランザクションの挿入が正確に2倍遅くなるというルールはありません。

要因(この例では2)は、トランザクションを使用すると、すべての挿入がまとめて行われるという事実から来ています。もちろん、他の多くの要素もあります(インデックスなど)。

関連する問題