我有一个 UPDATE WHERE id IN() 的性能问题。 伪代码是(归结):
从 PHP 开始交易:
$pdoAdapter->beginTransaction();
查询 MySQL 以获取来自外部世界并存储在数据库中且应开具发票的价格元素
SELECT id, price FROM incoming_price_elements WHERE <advanced where> FOR UPDATE
获取新的发票 ID
SELECT id FROM invoice_id_counter FOR UPDATE; UPDATE invoice_id_counter SET id=id+1;
在 PHP 中创建包含大量求和和其他聚合的发票并存储结果
INSERT INTO invoices (id, total_price) VALUES (<id from 3.>, <total price summed>);
更新所有 incoming_price_elements 以将它们标记为已开票
UPDATE incoming_price_elements SET invoice_id=<id from 3.> WHERE id IN (<all ids selected in 2.>);
提交
我的问题是第 5 步非常慢(在秒范围内)并且它在第 3 步中阻塞了 id 计数器。 传输的id数大于10000个id且id为主键。
关于如何优化它有什么建议吗?我正在考虑创建一个临时表并将所有 ID 选择到其中,但我对临时表的经验为零。
最佳答案
您可以使用 INNER JOIN 代替 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.>
这应该会提高这部分“交易”的表现
关于php - Mysql性能更新in(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54402165/