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 小的二级索引从机行数,当没有二级索引的时候,才会根据主键来统计行数
本文对比了InnoDB和MyISAM存储引擎下`count(*)`与`count(1)`的执行效率,指出InnoDB通过全表扫描计数,而MyISAM利用元信息加速。同时,强调了在InnoDB中使用二级索引优化`count(字段)`的重要性。
4355

被折叠的 条评论
为什么被折叠?



