MySQL 性能难题:子查询性能异常
当尝试从数据库检索重复记录时,SQL 查询利用子查询来识别相关行表现出令人惊讶的性能差异。
初始查询通过对特定字段进行分组和过滤来有效隔离重复记录,执行速度很快。然而,随后的查询试图检索其值与重复集中的值相匹配的所有行(使用 WHERE ... IN(子查询)构造实现)变得异常缓慢。
尽管存在索引相关领域,执行需要几分钟才能完成。由于怀疑数据库限制,从子查询创建了一个视图,并修改了父查询以引用该视图。这导致了近乎瞬时的执行。
揭开罪魁祸首:相关查询问题
经过调查,发现性能缓慢源于查询的相关性质子查询。在相关子查询中,内层查询引用了外层查询的某个字段,导致外层查询中的每一行都执行多次子查询,导致效率降低。
解决瓶颈:隔离子查询
为了减轻性能损失,通过从子查询中选择所有列并为其分配别名,将相关子查询转换为非相关子查询。这保证了子查询只执行一次,显着提高了查询性能。
修改后的父查询,现在引用不相关的子查询结果,以期望的效率执行,解决了性能问题。
以上是为什么我的 WHERE IN(子查询)查询很慢,但从子查询引用视图却很快?的详细内容。更多信息请关注PHP中文网其他相关文章!