单条行更新SQL执行超一小时未完成,请求原因排查
问题分析与优化方案
你这条UPDATE语句用了相关子查询,意味着mints表的每一行(2万条)都会单独执行一次SELECT MAX(lamports) FROM postbalances WHERE account = mints.bc的查询。如果postbalances表的account字段没有建索引,每次子查询都会全表扫描500万条数据——2万次全表扫描带来的磁盘IO开销会让进程大部分时间都在等待磁盘读取完成,CPU自然处于空闲状态,这就是你看到CPU使用率低但查询跑不动的核心原因。
另外,虽然你觉得没有锁竞争,但如果mints表在更新时有其他读写操作,行锁等待也可能拖慢速度,但当前场景下IO瓶颈是主因。
优化步骤
给
postbalances表加索引
先给account字段创建索引,让子查询能快速定位数据:CREATE INDEX idx_postbalances_account ON postbalances(account);改用非相关子查询批量更新
先一次性计算出所有account对应的最大lamports,再关联mints表更新,避免重复扫描postbalances:UPDATE mints SET max_sol = agg.max_lamports FROM ( SELECT account, MAX(lamports) AS max_lamports FROM postbalances GROUP BY account ) AS agg WHERE mints.bc = agg.account;这种方式只需要扫描
postbalances表一次,再通过关联匹配mints数据,效率会提升几个数量级。
内容的提问来源于stack exchange,提问作者tymur999
相关产品推荐
相关产品推荐

