SELECT count(column) 的执行速度比 SELECT * 慢。

5

两个简单的查询:

  • SELECT * FROM some_table WHERE some_column = 1

    返回一个包含所有记录的数组,包括列和值,总共约100K条。完成时间大约为40毫秒。

  • SELECT COUNT(id) FROM some_table WHERE some_column = 1

    仅返回记录计数值,与上述查询相同。需要1秒钟!!

EXPLAIN QUERY PLAN 对于两个查询告诉我同样的事情:正在使用索引搜索表...

我错过了什么?为什么获取计数比获取实际记录更慢?

我真的不想使用第一个查询,因为我只需要计数,并且获取100K条记录肯定会使用所有可用的内存:(

EXPLAIN QUERY PLAN 输出:

查询#1:

selectid    order   from    detail
0   0   0   SEARCH TABLE atts USING INDEX idxType (type=?)

查询 #2:

selectid    order   from    detail
0   0   0   SEARCH TABLE atts USING COVERING INDEX idxType (type=?)

2
请考虑将 EXPLAIN 的整个输出粘贴到您的问题中。此外,您之前运行过 SELECT * 吗?结果可能已经在查询缓存中。这两个时间是否一致可重复? - Amber
是的,即使它们是从缓存中获取的,为什么计数也没有被缓存呢? - Alex
3
COUNT(*) 的结果是否相同? - Amber
为什么它被标记为PDO? - Your Common Sense
我正在使用PDO类从数据库中读取数据。但是我在一些sqlite管理工具中进行了这些测试。在使用PDO的应用程序中,计数查询速度有点慢(大约4秒)。这就是为什么我在管理工具中打开了数据库并进行了这些测试的原因... - Alex
显示剩余5条评论
3个回答

3

事实证明,这两个查询没有区别,因此根本没有问题。

谈到总体时间 - 显然你需要从玩具数据库转向真正的数据库。


我认为你是正确的,我的管理员应用程序会使用某种LIMIT子句获取结果,即使我没有在查询中添加它。 - Alex

2
整个问题都是由于缓存引起的。第一次请求需要从服务器获取数据,而第二次请求则不需要。 重新运行两个代码,交换两个查询或多次运行它,你会发现没有任何区别。

1
我想这可能需要它记住已经被计算过的ID,并且还需要检查空条目。
如果您还没有这样做,我建议在some_column上添加索引以加快速度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接