【发布时间】:2011-11-18 09:15:55
【问题描述】:
我有一个基于某些表连接的视图 (viewX):
当我使用WHERE时,查询延迟,处理器使用率达到50%,最后我需要关闭mysqld.exe服务并重新启动以尝试再次解决问题。
当我使用HAVING 时,查询完美而快速地执行,我得到了结果,一切就绪。
查询类似这样:
SELECT * FROM viewX WHERE column_of_view = 'foo'
SELECT * FROM viewX HAVING column_of_view = 'foo'
发生了什么?
我找到的解决方案是这样做:
SELECT * FROM (SELECT * FROM viewX) as T WHERE column_of_view = 'foo'
SELECT * FROM (SELECT * FROM viewX) as T HAVING column_of_view = 'foo'
两个查询都很好,但是,我认为这很糟糕! (SELECT * FROM (...viewX)????)
【问题讨论】:
-
你能发布一些执行计划吗?
-
我最好的猜测是,通过使用 HAVING 你会混淆查询优化器,就像你让我感到困惑一样,并且这种混淆会导致不同的执行计划(不同的连接顺序和方法),在这个case 实际上可能是有益的(对于许多连接,次优连接顺序的可能性是巨大的)。它只是更快地返回前几行,还是所有行的整个选择也更快?
-
如果同时指定会发生什么?
-
视图是否已有聚合?
标签: mysql select where-clause having-clause