哪个更快?同一事务中的多个更新查询,还是单个查询?
例如,在这种情况下,哪个更快?
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 有何不同?
并且
选择查询和更新查询情况之间有任何差异吗?
谢谢!
答案 0 :(得分:0)
第一个更快,因为要更新的记录只需要定位一次。此外,事务不会使数据库操作更快,它们只是确保它们全部执行或不执行,以防一个失败。
锁在这里没有意义,同样适用于select或update语句。
答案 1 :(得分:0)
每个查询都会产生MySQL花费的开销,例如分配和释放内存和资源,规划执行等。
因此,当您的查询“执行”相同的操作时,即在第一个表中找到并更新行,然后在第二个表中找到并更新某些行,您将获得更多开销。
开销通常只需几毫秒。但对于像“使用索引更新行”这样的查询(通常只需要几毫秒),开销通常会导致查询的完整执行时间,因为“操作”本身(找到行并写下新值)非常快。
因此,即使分解查询时不需要两次开销的所有部分(例如“检查权限,如果允许更新第一个表”,则只需要一次两种情况),你的第二个场景可能需要大约两倍于第一个查询的时间,因为这里的开销需要相对较大的时间。
您应该始终检查合并您的查询是否实际上节省了时间(例如,通过查看执行计划或仅测量它,例如连续执行20次以获得可测量的时间)。有时MySQL会以不同于您期望的方式执行查询。如果你过度使用它,你的代码可能会变得不那么可读。
对于任何类型的查询,情况基本相同,例如: select
。
由于开销非常重要,MySQL在某些情况下具有摆脱它的功能。如果您多次执行相同的查询(例如,仅使用产品ID和价格因素替换多个产品使用update
),则可以使用prepared statements,例如来自php。这允许MySQL只进行一次这样的开销(例如计划如何执行查询),以下基本相同的查询可以重用它。
这与交易没什么关系(尽管你的第二种情况增加了死锁的可能性,如果你有一个不同的交易首先更新价格,然后尝试更新产品,这可能会影响执行速度因为你不得不重复交易。)
答案 2 :(得分:0)
哪个更快?同一事务中的多个更新查询,还是单个查询?
一些大型查询比许多小查询更快。它取决于表的大小以及要更新的数据大小。一次执行多个更新会更快,但也会导致开销。
是否应该考虑锁定?
是,请检查this以了解SQL语句设置的mysql锁。