专栏首页用户画像count(*) count(1)与count(col)的区别

count(*) count(1)与count(col)的区别

一、执行结果

count(*) 和count(1) 都是统计行数,而count(col) 是统计col列非null的行数

二、执行计划  

MyISAM与InnoDB,正如在不同的存储引擎中,count(*)函数的执行是不同的

在MyISAM存储引擎中,count()函数是直接读取数据表保存的行记录数并返回,效率很高,但是如果添加了where条件的话,MyISAM表也不能返回得很快。

在InnoDB存储引擎中,count(*)函数是先从内存中读取表中的数据到内存缓冲区,然后扫描全表获得行记录数。在使用count函数中加上where条件时,在两个存储引擎中的效果是一样的,都会扫描全表计算某字段有值项的次数。

InnoDB 是索引组织表,主键索引树的叶子节点是数据,而普通索引树的叶子节点是主键值。所以,普通索引树比主键索引树小很多。对于 count() 这样的操作,遍历哪个索引树得到的结果逻辑上都是一样的。因此,MySQL 优化器会找到最小的那棵树来遍历。因此表有二级索引,则使用二级索引key_len最小的索引进行扫描,尽管这个二级索引的key_len的值大于主键,都使用二级索引。在保证逻辑正确的前提下,尽量减少扫描的数据量,是数据库系统设计的通用法则之一。

count(字段)

1、如果这个字段定义为not null的话,一行行地从记录里面读出这个字段,判断不能为null,按行累计加1

2、如果这个字段定义允许为null,一行行地从记录里面读出这个字段,执行的时候还要判断是否为null,不为null的按行累计加1,返回累加值

三、执行效率  

1、如果在开发中确实需要用到count()聚合,那么优先考虑count(*),因为mysql本身对于count(*)做了特别的优化处理。

有主键或联合主键的情况下,count(*)略比count(1)快一些。  没有主键的情况下count(1)比count(*)快一些。  如果表只有一个字段,则count(*)是最快的。

2、使用count()聚合函数后,最好不要跟where age = 1;这样的条件,会导致不走索引,降低查询效率。除非该字段已经建立了索引。使用count()聚合函数后,若有where条件,且where条件的字段未建立索引,则查询不会走索引,直接扫描了全表。

3、count(字段),非主键字段,这样的使用方式最好不要出现,因为它不会走索引。

count(主键ID)比count(1)慢的原因?

对于 count(主键 ID) 来说,InnoDB 引擎会遍历主键索引树,把每一行的ID值取出来,返回给server层,server层拿到ID后,判断是不可能为空的,按行累加加1,最后返回累计值。

对于count(1),InnoDB引擎会扫描主键索引树,但不取值,server层对于返回的每一行,按行累计加1,判断不可能为NULL,返回累计值。

从InnoDB引擎层返回ID会涉及到解析数据行、拷贝字段值的操作,因此count(主键 ID)执行要比count(1)执行慢。

count(主键id)走主键索引的时候效率较count(*)差的原因?

平时我们检索一列的时候,基本上等值或范围查询,那么索引基数大的索引必然效率很高(符合走主键索引查找速度最快的原则)。

但是在做count(*)的时候并没有检索具体的一行或者一个范围,那么选择基数小的索引对count操作效率会更高。在做count操作的时候,mysql会遍历每个叶子节点,所以基数越小,效率越高。mysql非聚簇索引叶子节点保存指向主键ID的指针,所以需要检索两遍索引。但是这里相对于遍历主键索引,即使检索两遍索引效率也比单纯的检索主键索引快。

Innodb是索引组织表,主键索引树的叶子节点是数据,而普通索引树的叶子节点是主键值,索引普通索引树小很多,索引长度越小树的大小就越小。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • count(1)、count(*) 与 count(列名) 的执行区别

    当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了!

    范蠡
  • count(1)、count(*) 与 count (列名) 的执行区别

    当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了!

    程序员小强
  • MYSQL Count(*)和Count(1)区别

    在SQL Server中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。本文会...

    用户1220053
  • MySQL中count(字段) ,count(主键 id) ,count(1)和count(*)的区别

    首先要弄清楚 count() 的语义。count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1...

    码农编程进阶笔记
  • 案例解析:count(1)、count(*) 与 count(列名) 的执行区别

    很多人认为count(1)执行的效率会比count()高,原因是count()会存在全表扫描,而count(1)可以针对一个字段进行查询。其实不然,count(...

    搜云库技术团队
  • MySQL count()函数及其优化count(1),count(*),count(字段)区别

    JavaEdge
  • 执行COUNT(1)、COUNT(*) 与 COUNT(列名) 到底有什么区别?

    来源:blog.csdn.net/iFuMI/article/details/77920767

    好好学java
  • 好问题:count(1)、count(*)、count(列)有什么区别?

    当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了!

    Java技术栈
  • select count(*)、count(1)、count(主键列)和count(包含空值的列)有何区别?

    最直接的方法,我想就是通过10053事件,来看下不同SQL对应的执行计划和资源消耗等情况,进而看看是否有些信息可以为我们所用。

    bisal
  • 面试必知 | MYSQL中count(*)、count(1)、count(col)之间的差异,你知道多少?

    如何才能够完美给面试官呈现出一个比较好的答案呢?下面我们就来详细的进行介绍;网上关于count(*)、count(1)、count(col)之间的差异的文章非常...

    SEian.G
  • count(*)、count(1)和count(column)区别以及执行效率高低比较

    小结: count(*) 对行的数目进行计算,包含NULL。 count(column) 对特定的列的值具有的行数进行计算,不包含NULL值。 count...

    黑泽君
  • 数据库COUNT(*)、COUNT(字段)和COUNT(1)的异同

    关于数据库中行数统计,无论是MySQL还是Oracle,都有一个函数可以使用,那就是COUNT。

    Java那些事儿
  • MySQL案例:count(*)和count(1)的效率问题

    相信大多数DBA都看见过这样一条SQL优化原则:用count(1)替换count(*);相信也有不少DBA因这个问题被开发diss过,用count(*)非常慢,...

    brightdeng@DBA
  • SQL语句case when外用sum与count的区别

    如果我想把商品按照1000元以下,1000-3000, 3000 以上分为三个档次显示出来,正确的语句是:

    solate
  • MySQL的count()函数及其优化

    注意:由于 SQL 查询对大小写不敏感,所以在 WHERE 条件中,无论是写成 ZARA 还是 Zara,结果都是一样的

    JavaEdge
  • MySQL查询---COUNT函数

    上一篇谈到了我们日常开发中经常需要用到的分页,在业务数据量不多的情况下,我们直接用limit指定偏移量就可以满足我们业务需求了,但是数据量大的时候使用limit...

    创译科技
  • 春招面试之N皇后问题

    n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

    公众号guangcity
  • 数据分析EPHS(6)-使用Spark计算数列统计值

    前两篇中咱们分别介绍了使用Excel、Python和Hive SQL计算统计值,这次咱们使用Spark SQL来计算统计值。

    石晓文
  • LeetCode 刷题记录(三)

    这道题是「回溯法」的经典应用。基本的思路是:从第一行开始,每行按列循环放置皇后,如果找到一个符合规则的位置,则到下一行,以此类推,如果可以一直进行到最后一行,则...

    口仆

扫码关注云+社区

领取腾讯云代金券