背景:
- 表:wfp_test
- 字段:id — int(11)、name — varchar(255)、text_msg — varchar(2048)
- 数据量:300015条元组
一、count(*)、count(1)在没有索引的情况下
在没有索引的情况下count(*)、count(1)都全表扫描,效率一致
# 300000条记录,平均14s
SELECT count(*) FROM wfp_test;
EXPLAIN结果:
# 300000条记录,平均14s
SELECT count(1) FROM wfp_test;
EXPLAIN结果:
二、count(*)、count(1)在有主键索引的情况下
在有主键索引的情况下count(*)、count(1)都只遍历聚合索引树,使用主键索引,效率一致
# 300000条记录,平均10s
SELECT count(*) FROM wfp_test;
EXPLAIN结果:
# 300000条记录,平均10s
SELECT count(1) FROM wfp_test;
EXPLAIN结果:
三、count(*)、count(1)在有主键索引,且有辅助索引的情况下
在有主键索引、和辅助索引的情况下count(*)、count(1)都只遍历辅助索引树,使用辅助索引,效率一致
# 300000条记录,平均0.18s
SELECT count(*) FROM wfp_test;
EXPLAIN结果:
# 300000条记录,平均0.18s
SELECT count(1) FROM wfp_test;
EXPLAIN结果:
四、总结
- count(*)和count(1)效率基本上一致,只是效果会不一样。
- 一中没有使用索引,所以效率非常低
- 二中使用的是聚合索引,遍历聚合索引树,因为聚合索引的叶子节点包含所有字段,当有大字段时会造成多次io效率比较低
- 三中使用的是辅助索引,遍历辅助索引树,因为辅助索引的叶子节点只包含当前索引字段和指向聚合索引的标识,所以效率很高
tip:当需要count()时,建议建立小字段辅助索引可以提高很大的效率