为什么MySQL会进行扫描以进行更新,但会查找select

时间:2015-03-05 22:02:12

标签: mysql sql indexing query-performance

我有这两个查询。正如您可以看到它在TabRedemption中为orderItemID执行查找。选择需要几分之一秒,而更新需要约30秒。

为什么MySQL会在更新中使用完整的索引扫描,如何阻止它。它已经有一个外键约束和索引。

select RedemptionID from TabRedemption where orderItemID in
   (SELECT OrderItemID FROM TabOrderDetails WHERE OrderId = 4559775);

enter image description here

UPDATE TabRedemption SET active = 1 where orderItemID in
   (SELECT OrderItemID FROM TabOrderDetails WHERE OrderId = 4559775);

enter image description here

奇怪的是,如果我快速手动解析子查询。

UPDATE TabRedemption SET active = 1 where orderItemID in (2579027);

我注意到如果我快速使用update with join查询,但我不想这样做,因为它在h2database中不受支持。

另一方面,MS SQLServer可以做到这一点。

1 个答案:

答案 0 :(得分:1)

最佳解决方法

UPDATE  TabRedemption
    JOIN  TabOrderDetails USING(orderItemID)
    SET TabRedemption.active = 1
    WHERE  TabOrderDetails.OrderId = 4559775;

(或接近那个)

答案SELECTUPDATE使用不同的解析器。解决方法是向UPDATE添加第二个表,因为它将使用SELECT解析器。

Oracle 5.7正在解决解析器的差异。

请记住模式" IN(SELECT ...)"在许多情况下优化得很差(虽然显然不是你的情况)。