mysql select count(*)用哪里扫描全表?

时间:2017-08-21 01:06:24

标签: mysql sql

我有一个带有100M记录的innodb表,如下所示:

id    name   pid cid createdAt
int   char   int int timestamp

id为PK,pid编入索引:key

最常见的查询是select count(*) from table1 where pid='pid'

我的问题是这个查询是否进行全表扫描?

2 个答案:

答案 0 :(得分:1)

如果您想知道查询的作用,请查看“解释”计划。

如果您想加快相关查询的速度,请在table1(pid)上创建一个索引。

查询应该扫描索引而不是表。

答案 1 :(得分:1)

count(*)很少是你想要的。

count函数计算非空行,因此count(name)计算name字段不为空的记录。如果计算的字段未编入索引,则会导致全表扫描。

count(*)的情况下,数据库计算具有至少一个非空字段的记录,即它排除所有字段为空的记录。这可能是您想要的,但是大多数人在想要计算所有记录时都会错误地使用此表单,无论其内容如何。

在没有数据库特定语法的情况下计算所有记录的最有效方法是count(1)。这是有效的,因为每个记录的值1都不为空,并且不需要从数据库中读取任何数据。