MyISAM引擎会把一个表的总行数记录下来,所以在执行count(*)的时候会直接返回数量,执行效率很高。
InnoDB因为增加了版本控制(MVCC)的原因,同时有多个事务访问数据并且有更新操作的时候,每个事务需要维护自己的可见性,那么每个事务查询到的行数也是不同的,所以不能缓存具体的行数,每次都需要count一下所有的行数。
表 | count(1) | count(*) | count(列名) |
---|---|---|---|
作用 | 统计表中的所有的记录数 | 统计表中的所有的记录数 | 统计该字段在表中出现的次数 |
是否包含字段为null | 包含 | 包含 | 不包含 |
区别 | count(1)和count(*)基本没差别,实际建议count(*) |
根据结果count一下所有的行数,其性能更依赖于where条件
count(*) :它会获取所有行的数据,不做任何处理,行数加1
count(1):它会获取所有行的数据,每行固定值1,也是行数加1
count(id):id代表主键,它需要从所有行的数据中解析出id字段,其中id肯定都不为NULL,行数加1
count(普通索引列):它需要从所有行的数据中解析出普通索引列,然后判断是否为NULL,如果不是NULL,则行数+1
count(未加索引列):它会全表扫描获取所有数据,解析中未加索引列,然后判断是否为NULL,如果不是NULL,则行数+1
count的性能从高到低是:count(*) ≈ count(1) > count(id) > count(普通索引列) > count(未加索引列)