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(*)
;它更简单,更快,并且可能给出相同的答案。 (如果 col
是 PRIMARY KEY
,答案是一样的。)
天哪!这意味着您的第一个查询 而不是 多余! odd-ball 的情况是 col1
在 每 行中是 NULL
。第一个查询将 return 计数为零,但第二个查询将 return 一些行(第一列 NULL
)。
这是一个骗人的问题吗?
我正在查看一位已不在身边的老开发人员编写的一些代码。我发现我不太确定做的事情是否有意义,但我认为我没有足够的知识或足够的能力 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(*)
;它更简单,更快,并且可能给出相同的答案。 (如果 col
是 PRIMARY KEY
,答案是一样的。)
天哪!这意味着您的第一个查询 而不是 多余! odd-ball 的情况是 col1
在 每 行中是 NULL
。第一个查询将 return 计数为零,但第二个查询将 return 一些行(第一列 NULL
)。
这是一个骗人的问题吗?