为什么MySQL会扫描更新而查找选择

为什么MySQL会扫描更新而查找选择,mysql,sql,indexing,query-performance,Mysql,Sql,Indexing,Query Performance,我有两个问题。正如您所看到的,它在orderItemID的选项卡中进行查找。选择只需几分之一秒,而更新只需约30秒 为什么MySQL会在更新中使用完整的索引扫描,我如何才能阻止这种情况。它已经具有外键约束和索引 select RedemptionID from TabRedemption where orderItemID in (SELECT OrderItemID FROM TabOrderDetails WHERE OrderId = 4559775); 奇怪的是,如果我手动解

我有两个问题。正如您所看到的,它在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 (2579027);
我注意到,如果我使用带有join的
更新,查询速度会很快,但我不想这样做,因为H2数据库不支持它

另一方面,MS SQLServer做得很好。

最佳解决方案:

(或类似的东西)

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

MySQL 5.7中的Oracle正在解决解析器之间的差异


请记住,“in(SELECT…)”模式在许多情况下优化效果很差(尽管显然不是您的情况)。

您能用EXPLAIN和table定义编辑您的问题吗?
UPDATE TabRedemption SET active = 1 where orderItemID in (2579027);
UPDATE  TabRedemption
    JOIN  TabOrderDetails USING(orderItemID)
    SET TabRedemption.active = 1
    WHERE  TabOrderDetails.OrderId = 4559775;