【发布时间】:2020-08-06 14:49:25
【问题描述】:
我正在查看一位老开发人员编写的一些代码,他已不在身边。我发现了一些我不太确定是否有意义的事情,但我认为我没有足够的知识或足够好的 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;
所以我的第一个想法是这似乎是多余的,应该首先使用选择查询的结果。我挖得更远了,因为提交建议它进行性能调整。
据我从谷歌搜索得知,count 实际上会更快,因为它不必返回任何数据或提取任何行,并且可以完全依赖索引。
但是,在我上面编写的伪代码中,where 子句不返回任何行的情况似乎不会提高性能,因为 count 和 select 都不会返回任何结果。另外,当有实际结果时,我们会执行其中两个查询,而不仅仅是一个。
此外,由于我们首先使用的是行,因此我们应该只在一次查询中获取数据,而不是两次访问数据库。
我完全不在这儿吗?
我们正在使用 MySql v5.6.46
【问题讨论】:
-
查询编写时使用 * 没关系。但在生产环境中从未使用过 SELECT *。总是使用必需的列名。因为它也会影响你的表现。除此之外,我从您的第一个查询中了解到的是,如果您使用的是 COUNT(),那么如果没有找到记录,它将给您 0。但是如果您使用的是 SELECT column_1,那么它会给您 null。所以,根据你的条件。我觉得使用 SELECT column_1。这将返回空白 Null
-
@PTank 感谢您的回答,我已从查询中删除 *,因为代码实际上没有它,它只是编写不佳的示例代码。我不太担心 null vs 数组检查,因为这一切都包含在一个适当处理类型检查的 ORM 中,我刚刚用它们转换为的 sql 替换了 ORM 调用。我在这里的问题更多是关于预先进行额外计数查询的性能影响以及是否会提高性能或降低性能。
标签: mysql database-performance query-performance