WHERE IN 中的子查询导致 MySQL 性能下降
当尝试识别和检查 MySQL 数据库中的重复行时,结果是一个看似简单的查询性能出乎意料地缓慢。初始查询旨在选择“relevant_field”列中具有重复值的所有行,使用以下结构:
SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1
此查询执行速度很快,但是当构造后续查询来检索'some_table' 的 'relevant_field' 值与第一个查询中的值匹配,性能急剧下降。
SELECT * FROM some_table WHERE relevant_field IN ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 )
性能缓慢可归因于子查询作为相关查询的性质。在这种情况下,主查询处理的每一行都会执行子查询,从而导致过多的开销。
为了缓解此性能问题,通过选择将相关子查询转换为非相关子查询是有利的子查询中的所有列。
SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery
通过进行此修改,主查询的性能显着提高改进。
SELECT * FROM some_table WHERE relevant_field IN ( SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery )
此修改后的查询利用 MySQL 的优化功能来有效检索重复行,而不会产生与原始相关子查询相关的性能损失。
以上是为什么我的 WHERE IN 中带有子查询的 MySQL 查询如此慢?的详细内容。更多信息请关注PHP中文网其他相关文章!