我有一个带有100M记录的innodb表,如下所示:
id name pid cid createdAt
int char int int timestamp
id为PK,pid编入索引:key
最常见的查询是select count(*) from table1 where pid='pid'
我的问题是这个查询是否进行全表扫描?
答案 0 :(得分:1)
如果您想知道查询的作用,请查看“解释”计划。
如果您想加快相关查询的速度,请在table1(pid)
上创建一个索引。
查询应该扫描索引而不是表。
答案 1 :(得分:1)
count(*)
很少是你想要的。
count
函数计算非空行,因此count(name)
计算name
字段不为空的记录。如果计算的字段未编入索引,则会导致全表扫描。
在count(*)
的情况下,数据库计算具有至少一个非空字段的记录,即它排除所有字段为空的记录。这可能是您想要的,但是大多数人在想要计算所有记录时都会错误地使用此表单,无论其内容如何。
在没有数据库特定语法的情况下计算所有记录的最有效方法是count(1)
。这是有效的,因为每个记录的值1
都不为空,并且不需要从数据库中读取任何数据。