在id IN()的更新中,我遇到了性能问题。伪码是(简化):
我的问题是,步骤5非常慢(在秒范围内),它在步骤3中阻塞id计数器。要传输的id数超过10.000 id,并且id是主键。
关于如何优化这个问题,有什么建议吗?我正在考虑创建一个临时表并选择其中的所有in,但我对临时表没有任何经验。
发布于 2019-01-28 12:45:22
而不是IN子句,您可以使用内部联接
UPDATE incoming_price_elements a
INNER JOIN (
SELECT id
FROM incoming_price_elements
WHERE <advanced where>
) t ON t.id = a.id
SET invoice_id= <id from 3.>这将提高“事务”的这一部分的性能。
发布于 2019-01-29 17:43:53
根据您的评论之一,数据正在“持续”添加到incoming_price_elements中吗?那张桌子算是个“集结地”?一个问题是,如果在完成处理之前添加了新的项目,那么就会有麻烦吗?
如果是的话,那就让我们翻翻吧。
CREATE TABLE next_icp LIKE incoming_price_elements;
RENAME TABLE incoming_price_elements TO prev_icp,
next_icp TO incoming_price_elements; -- swap in an empty table
-- now process `prev_icp` as discussed already.至于延迟,让我们在启动事务之前尝试做更多的处理。
您可以在incoming_price_elements中增加一些列来处理“大量的求和和其他聚合”吗?在启动事务之后,执行其他操作,最后(如scaisEdge所建议的)执行“多表更新”(使用JOIN)而不是IN。
如果这仍然太具有侵入性,那么一次执行is 100,而不是一次执行全部。UPDATE必须保存旧行以防止崩溃(等等);这将付出很大的代价。通过拆散它;你让其他的连接完成一些工作。
这是在步骤1..6周围放置一个循环,每次只关注100行,直到您用完了暂存表。这将让其他is在中间被抓取;我希望这是可以的。
https://stackoverflow.com/questions/54402165
复制相似问题