EXISTS比COUNT(*)> 0更有效吗?

时间:2011-03-10 19:17:21

标签: mysql performance exists

我正在使用MySQL 5.1,我的查询大致有以下形式:

select count(*) from mytable where a = "foo" and b = "bar";

在我的程序中,它唯一检查的是零还是非零。如果我将其转换为:

select exists(select * from mytable where a = "foo" and b = "bar");

MySQL是否足够聪明,可以在第一次搜索时停止搜索?或者是否有其他方式与MySQL通信,我的目的只是找出是否有任何记录与此匹配,我不需要精确计数?

5 个答案:

答案 0 :(得分:28)

是的,当使用Exists函数返回行时,MySQL(事实上所有数据库系统都是我知道的)将停止处理。

您可以在MySQL文档中阅读更多内容: If a subquery returns any rows at all, EXISTS subquery is TRUE.

答案 1 :(得分:12)

我已经运行了1000个查询的测试。 SELECT EXISTSSELECT COUNT快约25%。将limit 1添加到SELECT COUNT没有任何区别。

答案 2 :(得分:2)

最可靠的方式可能是LIMIT 1,但这不是重点。

如果您有一个像CREATE INDEX mytable_index_a_b ON mytable (a,b)这样的索引,MySQL应该足够聪明,可以从索引返回计数,而不是触及任何行。 LIMIT 1的好处可能微不足道。

如果(a,b)上没有索引,那么表现会很糟糕。 LIMIT 1可能会让它显得不那么糟糕,但它仍然会很糟糕。

答案 3 :(得分:2)

这也可能是一种方法。

select 1 from mytable where a = "foo" and b = "bar" limit 1;

这不会影响所有符合where条件的记录,而是返回' 1'在第一次'击中后#39; 缺点是您需要检查结果,因为可能会返回空记录集。

答案 4 :(得分:1)

我不知道这对于优化有多好,但它在功能上应该与exists相同。例外情况是,如果没有匹配,它将不返回任何行。

SELECT true from mytable where a = "foo" and b = "bar" LIMIT 1;