mysql——count(*)、count(1)和count(字段)谁更快?有什么区别?
目录
- 一、count(*)、count(1)和count(属性)谁更快?有什么区别?
- 1.1、示例
- 1.2、count(*)、count(1)和count(属性)区别
- 1.2.1、语义区别
- 1.2.2、count(*)和count(1)在功能和性能上区别
一、count(*)、count(1)和count(属性)谁更快?有什么区别?
1.1、示例
-
例如表结构及数据如下图:
-
分别执行如下3条sql语句
SELECT count(*) FROM t_user; SELECT count(1) FROM t_user; SELECT count(names) FROM t_user;
1.2、count(*)、count(1)和count(属性)区别
1.2.1、语义区别
-
count(*) 返回3条数据。
说明统计满足条件的结果集的总行数,包括所有行(无论是否包含NULL值)
-
count(1) 返回3条数据。
说明与count(*)功能相同,统计所有行数。
-
count(names) 返回2条数据。
说明统计该字段非NULL的行数(若字段允许NULL,则仅统计非NULL值)
1.2.2、count(*)和count(1)在功能和性能上区别
-
mysql官网上表示count(*)和count(1)在功能和性能上没有任何区别,下图为官网截图:
-
通过explian执行计划查看,如下图:
explain SELECT count(*) FROM `t_user`; show WARNINGS;
-
可以看到mysql底层对这个查询进行了sql优化,把 count(*) 优化成了count(0),其中count(0)和count(1)是没有任何区别的,只是为了标记当前这条数据存在的一个常量,所以优化完之后的这个**count(*)**跟count(1)肯定是没有任何性能上的区别。
-
如果非要进行比较的话,肯定还是 **count(*)**比count(1)略胜一筹,因为它不需要mysql在底层进行任何的sql优化。