我正在尝试优化查询,例如:
UPDATE master SET count =
(SELECT COUNT(*) FROM detail WHERE detail.master_id=master.id)
主表很大,因此运行它会导致巨大的顺序扫描。另一方面,这个计数不会经常改变,所以我的想法是像这样重写它:
UPDATE master SET count =
(SELECT COUNT(*) FROM detail WHERE detail.master_id=master.id)
WHERE count !=
(SELECT COUNT(*) FROM detail WHERE detail.master_id=master.id)
EXPLAIN 告诉我这会导致两个子计划,这是我所期望的。有没有办法避免两个执行的子计划?
尝试将上面的重写为
UPDATE master SET count =
(SELECT COUNT(*) FROM detail WHERE detail.master_id=master.id) AS cnt
WHERE count != cnt
因“AS”处的语法错误而失败。
这应该更快:
这假设
master.id
是唯一的。