【问题标题】:Why does MySQL do a scan for update but lookup for select为什么MySQL会扫描更新但查找选择
【发布时间】:2015-03-05 22:02:11
【问题描述】:

我有这两个问题。如您所见,它在 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 可以做到这一点。

【问题讨论】:

  • 你能用 EXPLAIN 和表格定义编辑你的问题吗?

标签: mysql sql indexing query-performance


【解决方案1】:

最好的解决方法

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

(或类似的东西)

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

Oracle 在 MySQL 5.7 中解决了解析器的差异。

请记住,模式“IN (SELECT ... )”在许多情况下优化不佳(尽管显然不是您的情况)。

【讨论】:

    猜你喜欢
    • 2016-08-10
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2021-01-31
    相关资源
    最近更新 更多