【发布时间】:2019-01-30 01:43:53
【问题描述】:
我遇到了 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数量超过10.000个id,并且id是主键。
关于如何优化它的任何建议?我正在考虑创建一个临时表并选择其中的所有 id,但我对临时表的经验为零。
【问题讨论】:
-
是否有理由自己增加 id 而不是使用
AUTO_INCREMENT?您是否需要其他表格中的发票 ID(因此在执行第 5 步之前需要知道该 ID)?
标签: php mysql optimization