我正在使用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通信,我的目的只是找出是否有任何记录与此匹配,我不需要精确计数?
答案 0 :(得分:28)
是的,当使用Exists函数返回行时,MySQL(事实上所有数据库系统都是我知道的)将停止处理。
您可以在MySQL文档中阅读更多内容: If a subquery returns any rows at all, EXISTS subquery is TRUE.
答案 1 :(得分:12)
我已经运行了1000个查询的测试。 SELECT EXISTS
比SELECT 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;