gpt4 book ai didi

mysql - 当查询返回 0 行时,选择计数与选择语句性能

转载 作者:行者123 更新时间:2023-12-04 09:14:19 27 4
gpt4 key购买 nike

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

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 查询的结果。我挖得更远,因为提交建议它用于性能调整。
从我从谷歌搜索中了解到的是,计数实际上会更快,因为它不必返回任何数据或提取任何行并且可以完全依赖于索引。
然而,在我上面写的伪代码中, where 子句不返回任何行的情况似乎我们不会得到性能提升,因为 count 和 select 都不会返回任何结果。另外,当实际有结果时,我们会执行其中的两个查询,而不仅仅是一个。
此外,似乎因为我们首先使用的是行,所以我们应该只在一次查询中获取数据,而不是两次访问数据库。
我完全不在基地吗?
我们使用的是 MySql v5.6.46

最佳答案

你是对的。 【但是要一直读到最后!】
两步是低效的——在任何版本的 MySQL 中。如果有零行,优化器将为 SELECT 做基本相同的工作量。 .
如果有一些行,那么第一个 SELECT是浪费时间。请参阅编程首字母缩写词“KISS”。
伪代码暗示“返回”是一个空数组;我假设当没有匹配的行时,任一查询都是这种情况?
旁注:希望ColumnInIndex表示“在某个索引中排在第一位的列”。如果列不是第一列,则两个查询都不会使用索引。 (此评论不影响主要问题。)
另一个旁注(针对 PTank):当没有匹配的行时,这些都不是

SELECT col FROM ... WHERE ...
SELECT * FROM ... WHERE ...
返回任何行;他们不回来 NULL对于列。 (由于与原始问题无关的多种原因, * 的使用是“不好的”。)
哦,还有一个评论。 COUNT(col)支票 col因为在计算行之前不是 NULL。 COUNT(*)简单地计算行数。在几乎所有情况下,您都应该使用 COUNT(*) ;它更简单,更快,并且可能给出相同的答案。 (如果 colPRIMARY KEY ,答案将相同。)
好伤心!!这意味着您的第一个查询不是多余的!奇怪的情况是在 col1 时是 NULL在每一行。第一个查询将返回零计数,但第二个查询将返回一些行(第一列 NULL )。
这是一个棘手的问题吗?

关于mysql - 当查询返回 0 行时,选择计数与选择语句性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63286196/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com