前言:
而今你们对“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