2012-02-16 21 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)来自事实,即如果您使用事务,则所有插入一次完成。当然还有很多其他因素,只是为了处理复杂(如索引)。