count()函数用于返回结果不为NULL的个数。首先存储引擎需要查询出结果集,其次server层逐个结果判断是否为NULL,不为NULL则加1。
count(非索引字段):1.server层需要判断每个数据是否为NULL。2,走聚簇索引,解析出每一行数据。无法使用覆盖索引,理论上最慢。
count(索引字段): 可以索引覆盖,依然需要判断字段是否为NULL。注意:这里使用主键或者非空索引,依然需要server判断是否为空,因为判空这个动作是在server上。
count(1): count(1)只扫描索引树,没有解析数据行的过程,理论更快。但server依然需要判断“1是否为NULL”。
count(*):用来返回数据表行数。由于Innodb支持事物,数据库中不记录数据表行数。mysql专门优化count(*)直接返回索引树中数据的个数,跳过server层。