龙空技术网

mysql 中count(1) count(*) count(col_name)区别

正能量大龄程序猿 64

前言:

而今你们对“mysqlifcountnull”大概比较看重,大家都想要剖析一些“mysqlifcountnull”的相关内容。那么小编在网络上网罗了一些对于“mysqlifcountnull””的相关资讯,希望各位老铁们能喜欢,朋友们快快来学习一下吧!

mysql 中count(1) count(*) count(col_name)区别

这三个在innodb中有什么区别吗(这里我们前提都是没有where条件的,如果有where条件则按实际情况有所不同)?

首先我们对一个表进行查询

select count(*) ,count(1),count(recomm_user_id) from user ;

从上面我们得出 统计的区别是

count(*) count(1) 都是统计结果的行数

count(列名) 则是统计该列不为null的条数

性能对比

count(col_name)的执行计划如下

explainselect count(address) from user ;

结论:count(col_name) 这个不一定走索引,可能需要全表扫描

count(1) count(*)执行计划如下

 explain select count(1) from user;explain select count(*) from user ;

我们看到,这两个执行计划都一样,都是走索引,而且我们看到mysql 是对这个进行过优化的,并不是做主键索引,而是走最小的索引。我们把索引列出来看下

PRIMARY KEY (`user_id`) USING BTREE,

UNIQUE KEY `idx_user_mobile` (`mobile`) USING BTREE,

KEY `idx_user_status` (`status`) USING BTREE,

KEY `recomm_user_id` (`recomm_user_id`) USING BTREE

在这四个索引中 字段类型分别如下,

user _id bigint

mobile varchar(20)

status int

recomm_user_id bigint

第一个 user_id 为bigint 并且是主键,比较大 不使用

mobile 是 varchar(20) 字符串比较大

status int 最小的索引(也是使用这个,因为它最小)

recomm_user_id bigint

通过对比,status 为 int ,最小,所以也是使用这个来进行统计,

如果我们在给该表添加一个更小的索引,是不是就会用更小的索引呢? 我们找到该表studio_status 该字段为bit 比 int还小,添加完成后为我们在count 下看看效果

我们看到,统计已经使用更小的索引 studio_status 了

标签: #mysqlifcountnull