Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Is比COUNT(*)更有效>;0?_Mysql_Performance_Exists - Fatal编程技术网

Mysql Is比COUNT(*)更有效>;0?

Mysql Is比COUNT(*)更有效>;0?,mysql,performance,exists,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通信,我的目的只是想知道是否有任何

我使用的是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通信,我的目的只是想知道是否有任何记录与此匹配,并且我不需要精确的计数?

是的,MySQL(实际上,就我所知,所有数据库系统)将在使用Exists函数返回行时停止处理

您可以在MySQL文档中阅读更多内容:

我已经用1000个查询运行了一个测试<代码>选择存在比
选择计数
快约25%。将
limit 1
添加到
SELECT COUNT
没有任何区别。

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

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

最可靠的方法可能是限制1,但这不是重点

如果您在mytable(a,b)
上有一个类似于
createindex mytable\u index\u a\b的索引,那么MySQL应该足够智能,能够从索引返回计数,而不会触及任何行。限制1的好处可能微不足道


如果(a,b)上没有索引,那么性能将非常糟糕。限制1可能会使事情变得不那么可怕,但仍然会很可怕。

这也可能是一种方法

select 1 from mytable where a = "foo" and b = "bar" limit 1;
这不会覆盖所有满足where条件的记录,而是在第一次“命中”后返回“1”。

缺点是您需要检查结果,因为返回的可能是空记录集。

尝试解释两个查询,您应该会得到答案。您可以发布解释输出,ppl将帮助您解码。MySQL不太可能知道如何优化
COUNT(*)>0
!ANSI标准说EXISTS更好,因为它不应该遍历或求值一行Zimbaao之外的内容:两个查询的解释都是相同的,只是在后一种情况下添加了一个“No tables used”条目。有人能告诉我第二个语句可以返回什么吗?我不确定SQLite会返回什么,以及其他简单的数据库。@tc-yes。即使是SQLLite也可以。甚至可以访问。我还没见过一个数据库没有。有证据或参考吗?@itsazzad-。为了验证MySQL是否会通过计算所有行来确定有多少行,只需要使用一个具有足够大数据集的解释计划来验证。@imk 1079;ззззззззззззбззбзаз,因为
select count
返回一行。:-)25%只是这一个例子。它可以快0%(例如,由于缺少足够的索引,需要扫描整个表),或者可以快99%(最佳索引,以及充分利用它的值)。这难道不可能返回多行,每个行都有一个值
true
?很抱歉,我在编辑中忘记了
限制1
。谢谢你指出这一点
true
1
是同义词。请记住,您得到的不是
false
0
),而是相反情况下的空结果集。好吧,我继承了一个遗留代码库,性能非常糟糕。:-)@肯:浏览数据库并添加一大堆索引可能是值得的。显而易见的索引已经存在,其中一些是相当大的表,插入性能也很重要。但是如果一百万行有(a,b),那么
COUNT(*)
必然会扫描索引中的一百万行(没有进一步的优化)并且
限制1
直到
计数完成后才会生效。Valyo的
选择1
将在找到第一个匹配(a,b)后停止,因为
存在()。