MyISAM不支持事务,MyISAM中的锁是表级锁;而InnoDB支持事务,并且支持行级锁。
count(1):InnoDB 遍历全表,但是不取值,server 层对返回的每一行数据新增一个 1,然后进行判断累加。包括NULL值行。
count(*):
- MyISAM把表的总行数单独记录下来,若没有where groupby,直接返回行数。包括NULL值行。
-
InnoDB不能使用这种缓存操作,因为支持事务,大部分操作都是行级锁,行可能被并行修改,那么缓存记录不准确。
但是,InnoDB还是针对COUNT(*)语句做了些优化的。InnoDB中索引分为聚簇索引(主键索引)和非聚簇索引(非主键索引),聚簇索引的叶子节点中保存的是整行记录,而非聚簇索引的叶子节点中保存的是该行记录的主键的值。MySQL会优先选择最小的非聚簇索引来扫表。
-
对于
count(1)
和count(*)
,MySQL的优化是完全一样的,根本不存在谁更快!但依旧建议使用count(*)。
count(字段):判断字段是否为NULL,在过滤统计。不包含NULL值行。