哪个更快?游标循环中的多个更新查询,还是单个查询?

Pel*_*ang 6 mysql performance optimization update query-performance

哪个更快?游标循环中的多个更新查询,还是单个查询?例如,在这种情况下,哪个更快?此查询在触发器中。

  1. 循环中的多个查询

    DECLARE done INT DEFAULT FALSE;
    DECLARE record_id INT;
    DECLARE cur CURSOR FOR SELECT id FROM table1 WHERE column = 0;
    
    OPEN cur;
    
      users_loop: LOOP
    
         FETCH cur INTO id;
    
         IF done THEN
             LEAVE users_loop;
         END IF;
    
         UPDATE table2 SET column = 0 WHERE id = id;
    
      END LOOP;
    
    CLOSE cur;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 单一查询

     CREATE TEMPORARY TABLE tmp_table (id int(10));
    
     INSERT INTO tmp_table SELECT id FROM table1 WHERE column = 0;
    
     UPDATE table2 SET column = 0 WHERE id IN(SELECT id FROM temp_table);
    
     DROP TABLE IF EXISTS tmp_table;
    
    Run Code Online (Sandbox Code Playgroud)

Joh*_* N. 2

这取决于很多因素:

  • 你的表定义
  • 你的索引定义
  • 您的事务隔离级别
  • 您的一般数据库负载
  • 可用内存
  • ...

如果您有足够的内存、处理器能力和临时表空间,那么您的第二条语句应该是最快的,但缺点是同时发生大量锁定。

InnoDB中不同SQL语句设置的锁

运行第一个语句可能会减少所有其他用户的锁定,但这又取决于连接到数据库的用户的事务隔离级别。

事务隔离级别

正如您所看到的,有很多因素会影响更新语句的执行。

如果没有更多详细信息,我更愿意使用第二个语句来提高速度,而您的第一个语句将在负载环境中使用。

这里也提出了类似的问题:

如何在 MySQL 中更新(非常)大的表而不加锁