哪个在mysql中更快?同一事务或单个查询中的多个更新查询?

时间:2017-07-08 03:51:45

标签: mysql transactions

哪个更快?同一事务中的多个更新查询,还是单个查询?

例如,在这种情况下,哪个更快?

UPDATE product p, productPrice pp
SET
p.name = newName, 
pp.price = pp.price * 0.8
WHERE 
p.productId = pp.productId
AND
p.productId = 1;

或者这个:

Update product set p.name = newName where productId = 1;
Update productPrice set price = price * 0.8 where productId = 1;

写在

a single transaction

是否应该考虑锁定

与mysql中的 lock 有何不同?

并且

选择查询更新查询情况之间有任何差异吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

第一个更快,因为要更新的记录只需要定位一次。此外,事务不会使数据库操作更快,它们只是确保它们全部执行或不执行,以防一个失败。

锁在这里没有意义,同样适用于select或update语句。

答案 1 :(得分:0)

每个查询都会产生MySQL花费的开销,例如分配和释放内存和资源,规划执行等。

因此,当您的查询“执行”相同的操作时,即在第一个表中找到并更新行,然后在第二个表中找到并更新某些行,您将获得更多开销。

开销通常只需几毫秒。但对于像“使用索引更新行”这样的查询(通常只需要几毫秒),开销通常会导致查询的完整执行时间,因为“操作”本身(找到行并写下新值)非常快。

因此,即使分解查询时不需要两次开销的所有部分(例如“检查权限,如果允许更新第一个表”,则只需要一次两种情况),你的第二个场景可能需要大约两倍于第一个查询的时间,因为这里的开销需要相对较大的时间。

您应该始终检查合并您的查询是否实际上节省了时间(例如,通过查看执行计划或仅测量它,例如连续执行20次以获得可测量的时间)。有时MySQL会以不同于您期望的方式执行查询。如果你过度使用它,你的代码可能会变得不那么可读。

对于任何类型的查询,情况基本相同,例如: select

由于开销非常重要,MySQL在某些情况下具有摆脱它的功能。如果您多次执行相同的查询(例如,仅使用产品ID和价格因素替换多个产品使用update),则可以使用prepared statements,例如来自php。这允许MySQL只进行一次这样的开销(例如计划如何执行查询),以下基本相同的查询可以重用它。

这与交易没什么关系(尽管你的第二种情况增加了死锁的可能性,如果你有一个不同的交易首先更新价格,然后尝试更新产品,这可能会影响执行速度因为你不得不重复交易。)

答案 2 :(得分:0)

哪个更快?同一事务中的多个更新查询,还是单个查询?

  
    

一些大型查询比许多小查询更快。它取决于表的大小以及要更新的数据大小。一次执行多个更新会更快,但也会导致开销。

  

是否应该考虑锁定?

  
    

是,请检查this以了解SQL语句设置的mysql锁。