【发布时间】:2021-03-19 14:17:47
【问题描述】:
这是一个select 查询,它在0.03 秒内执行:
select * from engine.transactions
where transaction_row not in (select transaction_row from d.pos_transactions)
我想以这种方式从上面的查询中更新匹配的(选择的)行:
update engine.transactions set retry = 0
where transaction_row not in (select transaction_row from d.pos_transactions)
返回timeout 错误:
#1205 - 超过锁定等待超时;尝试重启事务
为什么update 子句的性能下降这么多?
注意到engine.transactions 表上只有一个索引:transactions(psp_id, transaction_row)。
另外,表引擎是InnoDB
【问题讨论】:
-
将 WHERE NOT IN(在大多数情况下很慢)重写为 WHERE NOT EXISTS 或 JOIN WHERE IS NULL。
-
有多少记录需要更新?可能是锁定问题。我自己曾经做过的最愚蠢的事情是两个会话中的两个工作并锁定自己......,ups,打字变慢
标签: mysql sql performance select updates