HAVING与(子查询)WHERE的SQL引擎执行计划

时间:2019-04-04 23:42:19

标签: mysql sql optimization

执行后,以下两个sql查询之间是否有任何区别:

SELECT name, count(*) FROM mytable GROUP BY name HAVING count(*) > 1

并且:

SELECT * from (SELECT name, count(*) cnt FROM mytable GROUP BY name) x where cnt > 1

换句话说,是否有更多的“便利”子句简化了子选择的必要性,或者与第二种方法相比,使用hading语句时查询引擎的性能是否根本不同?当前在mysql中:

enter image description here

创建表格:

CREATE TABLE `mytable` (
  `name` varchar(20) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf-8;

1 个答案:

答案 0 :(得分:1)

在几乎所有其他数据库中,两者都是等效的。为简洁起见,HAVING通常是更好的选择。

至少在历史上,MySQL实现了子查询。因此,此查询:

SELECT * 
FROM (SELECT name, count(*) as cnt
      FROM mytable
      GROUP BY name
     ) x 
WHERE cnt > 1;

建议它将写出派生表,然后重新扫描它以查找最后的WHERE。但是,这对性能没有太大影响,因为GROUP BY已经在读写数据。

因此,这些查询在MySQL上的性能可能非常相似。而且,它们几乎对其他所有数据库都具有相同的执行计划。 HAVING子句使查询更简单。