count(主键id)
InnoDB 会遍历全表,取每行的主键 id,返回给 server 层,server 层拿到数据后,进行判断累加。
count(1)
InnoDB 仍遍历全表,但是不取值,server 层对返回的每一行数据新增一个 1,然后进行判断累加;
因此,count(1)要更快些,因为无需取值。从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。
count(字段):
- 如果这个“字段”是定义为 NOT NULL 的话,一行行地从记录里面读出这个字段,判断不能为 NULL ,按行累加;
- 如果这个“字段”定义允许为 NULL,那么执行的时候,判断到有可能是 NULL,还要把值取出来再判断一下,不是 NULL 才累加。
count(*)
并不会把全部字段取出来,而是专门做了优化,不取值。count(*)肯定不是 NULL,按行累加。
结论:按照效率排序的话,count(字段)<count(主键
id)<count(1)≈count(),所以我建议你,尽量使用count()。
引用:https://www.jianshu.com/p/e1229342a5e2