mysql - 使用事务运行 3 个数据库查询 1k 次是没有事务的两倍。正确的?

标签 mysql database transactions

我正在做一个小测试。以下代码运行 3 个随机查询 1000 次(针对 innoDB 表):

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 秒内运行!

这比我预期的要大得多。我想知道是否有什么我不明白的地方?

最佳答案

在这种情况下,简单的答案是,写入合并允许合并的 INSERT(查询循环的结果)比单个查询更快地访问磁盘。

答案并不简单,这在很大程度上取决于您的硬件和操作系统 - 例如具有最先进的 SSD(可能受 CPU 限制)的 Intel Atom 与具有 5400rpm 磁盘(可能受磁盘限制)的 i7 的 react 不同。

此外,这在很大程度上取决于您的并发性:在您的实验中,没有涉及并发性,这是事务的最佳情况。并行重试 100 个线程可能会得到不同的结果。

关于mysql - 使用事务运行 3 个数据库查询 1k 次是没有事务的两倍。正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9312657/

相关文章:

mysql - SQL 查询更改组子句

php mysql 和 javascript 加载冲突

database - Azure:上下文正在 Code First 模式下使用从 EDMX 生成的代码

c# - Entity Framework 如何处理事务?

mysql - Hibernate未插入到mysql : showing insert statements

Mysql (select a.id from table a) 和 (select table.id from table) 之间的区别

MySQL:引用子查询列

java - 合并数据库中的名字和姓氏并在文本字段中显示详细信息?

php - 一个MySQL数据库和多个表

ruby-on-rails - Rails 中的锁/事务/隔离级别的详尽指南