Select 计数 vs select 查询时的语句性能 return 0 行

Select count vs select statement performance when the query will return 0 rows

我正在查看一位已不在身边的老开发人员编写的一些代码。我发现我不太确定做的事情是否有意义,但我认为我没有足够的知识或足够的能力 google 找到答案,所以这里是:

代码如下所示:

var queryCount = SELECT COUNT(Col1) FROM MyTable WHERE ColumnInIndex = 'SomeValue'

if(queryCount == 0)
   return [];

var results = SELECT Col1, Col2, Col3,... FROM MyTable WHERE ColumnInIndex = 'SomeValue'
return results;

所以我的第一个想法是这似乎是多余的,应该首先使用 select 查询的结果。我挖得更远了,因为提交建议它用于性能调整。

根据我在谷歌搜索中的理解,计数实际上会更快,因为它不需要 return 任何数据或提取任何行并且可以完全依赖索引。

然而,在我上面写的伪代码中,where 子句不会 return 任何行的情况似乎我们不会得到性能提升,因为既不计数也不 select 会 return 任何结果。另外,当有实际结果时,我们会执行其中两个查询,而不是一个。

此外,由于我们一开始就使用行,所以我们应该只在一次查询中获取数据,而不是两次访问数据库。

我在这里完全偏离基地了吗?

我们正在使用 MySql v5.6.46

你是对的。 [但是一直读到最后!]

两个步骤效率低下 -- 在任何版本的 MySQL 中。如果有零行,优化器将为 SELECT.

执行基本相同的工作量

如果有一些行,那么第一个SELECT是浪费时间。请参阅编程首字母缩略词 'KISS'。

pseudo-code表示'return'是一个空数组;我假设没有匹配行时任一查询都是这种情况?

旁注:我希望 ColumnInIndex 表示“某个索引中 第一 的列”。如果该列不是第一个,则两个查询都不会使用索引。 (此评论不影响主要问题。)

另一个旁注(针对 PTank):当没有匹配的行时,这些都不会

SELECT col FROM ... WHERE ...
SELECT  *  FROM ... WHERE ...

return 任意行;他们不 return NULL 列。 (由于与原始问题无关的多种原因,* 的使用是 'bad'。)

哦,又是一条评论。 COUNT(col) 在计算行数之前检查 col 是否为 not-NULL。 COUNT(*) 只是计算行数。在几乎所有情况下,您都应该使用 COUNT(*);它更简单,更快,并且可能给出相同的答案。 (如果 colPRIMARY KEY,答案是一样的。)

天哪!这意味着您的第一个查询 而不是 多余! odd-ball 的情况是 col1 行中是 NULL。第一个查询将 return 计数为零,但第二个查询将 return 一些行(第一列 NULL)。

这是一个骗人的问题吗?