MySQL中 count(*)、count(主键id)、count(字段)和count(1)的区别

标题 count() 函数不同执行方式的执行区别

count(*) :对于这个命令,会每遍历一条数据进行累加,排除全字段为空的数据情况下 count++

count(1) :相当于新加一列,列值为1,此时每一行数据都会进行累加 count++

count(主键字段) :对于主键进行遍历,然后按行累加 count++【主键不为空】

count(普通字段) :针对普通字段进行逐行遍历,每当该字段值不为空的时候进行累加 1

count()函数执行效率

count(普通字段)< count(主键字段)< count(1)≈ count(*)

count() 函数实际执行的优化

常规情况下:

对于count(*) ,count(1) 和count(主键)而言,在底层的执行都是通过查询 主键索引树来进行遍历,只要遍历一个索引树就进行加一,这样就会将速率提高,对于一定程度而言,三者的查询效率的几乎相近的

但是对于count(主键) 而言,实际在执行主键索引树时,他会将查询的id 进行返回 ,然后再进行累加,所以一定程度上速率是比前两者的速率要慢的。

对于count(普通字段) 而言,在查询的时候是不走索引树的,但是在执行的时候会进行全表扫描,然后判断是否为空再进行累加

在创建普通索引时:

对于mysql底层而言,主键索引又叫聚簇索引,普通索引为非聚簇索引

对于主键索引而言,我们每一个的叶子节点存储的是所有数据(一整行数据)
对于非主键索引而言,每一个叶子节点存储的是只有主键id

在具体执行查询的时候,主键索引的内存比较大,非主键索引的内存比较小,故在这里mysql底层做出优化

当只有主键索引时,查询主键索引树,当既有主键索引和普通索引的时候,优先查询普通索引进行count

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值