Count( ? ) 效率的比较
count(*) count(1) count(具体字段)
引言1:
对于count(*)和count(1)虽然在性能上会有一点不同,但总体上可以看成二者的执行效率是相同的。 如果有where判断,则统计的是符合过滤后剩下的行数,如果没有where判断,则统计的是全表的行数
引言2:
对于MyISAM存储引擎,统计一张表的所有行数只需要O(1)的时间复杂度,因为myisam存储引擎为每一张表配置了一个meta信息存储了每一张表的row_count值,一致性是由表级锁来保证
如果是innodb存储引擎,由于支持事务,并且采用的是 行级锁粒度和MVCC机制,所以无法向myisam一样,维护一个row_count变量,所以innodb要进行全表扫描,时间复杂度为O(n)
进行循环+计数的方式完成统计
在innodb存储引擎中,如果采用count(字段)来统计行数,尽量采用
二级索引
,因为逐渐采用的是聚簇索引
,聚簇索引存储的信息明显大于二级所以你所存储的信息(非聚簇索引
),而对于**count(*)和count(1) 他们不需要查具体的行,只会从机行数,系统会自动选择占用空间小的二级所以你来完成统计**如果有多个二级索引,系统会使用 key_len 小的二级索引从机行数,当没有二级索引的时候,才会根据主键来统计行数