为什么MySQL会扫描更新而查找选择
我有两个问题。正如您所看到的,它在orderItemID的选项卡中进行查找。选择只需几分之一秒,而更新只需约30秒 为什么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); 奇怪的是,如果我手动解
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;