1.先说结论
性能从高到低:count(*) > count(1) > count(主键id) > count(字段)
2.分析
count(*):MySql专门做了优化,会选择一棵最小的索引树去遍历获得行数;
count(1):在统计的时候如果扫描到一行计数就加1,性能仅次于count(*);
count(主键id):在扫描的时候server层会把id从引擎层查出来,然后计数加1,因为需要把id取出来,所以性能差一些;
count(字段):在扫描的时候server层会把字段的值从引擎层查出来,并且只统计不为null的行,跟上述三个命令执行的结果不一定一样,性能也是最差的。
总结:如果涉及到统计一个表有多少行数据的,count(*)性能是最佳的。
3.其它的方案统计表的行数
(1)通过redis来计数,但是不是最精确的,这个其实就是redis和mysql的数据一致性问题了,看业务来决定,如果对数据一致性要求不是很高的话,可以通过redis来计数,毕竟redis性能不错;
(2)增加一个专门的计数表,来统计不同表的行数,字段设计大概如下:
id,table_name,create_time,update_time,然后table_name建立唯一索引;
放在事务里面跟业务sql一起执行,这样也保证了数据的一致性,但是性能没有redis好。