我有这两个查询。正如您可以看到它在TabRedemption中为orderItemID执行查找。选择需要几分之一秒,而更新需要约30秒。
为什么MySQL会在更新中使用完整的索引扫描,如何阻止它。它已经有一个外键约束和索引。
select RedemptionID from TabRedemption where orderItemID in
(SELECT OrderItemID FROM TabOrderDetails WHERE OrderId = 4559775);
UPDATE TabRedemption SET active = 1 where orderItemID in
(SELECT OrderItemID FROM TabOrderDetails WHERE OrderId = 4559775);
奇怪的是,如果我快速手动解析子查询。
UPDATE TabRedemption SET active = 1 where orderItemID in (2579027);
我注意到如果我快速使用update with join
查询,但我不想这样做,因为它在h2database中不受支持。
另一方面,MS SQLServer可以做到这一点。
答案 0 :(得分:1)
最佳解决方法:
UPDATE TabRedemption
JOIN TabOrderDetails USING(orderItemID)
SET TabRedemption.active = 1
WHERE TabOrderDetails.OrderId = 4559775;
(或接近那个)
答案是SELECT
和UPDATE
使用不同的解析器。解决方法是向UPDATE添加第二个表,因为它将使用SELECT解析器。
Oracle 5.7正在解决解析器的差异。
请记住模式" IN(SELECT ...)"在许多情况下优化得很差(虽然显然不是你的情况)。