目录

  • `count(*)`、`count(1)` 和 `count(字段)` 区别
    • `count(主键id)` 与 `count(1)`
    • `count(*)` 与 `count(字段)`
      • `count(字段)`
      • `count(*)`
  • `count()` 的优化
    • `count()` 的优化

count(*)count(1)count(字段) 区别

count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值

count(*)count(主键id)count(1) 都表示返回满足条件的结果集的总行数;而count(字段)则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数

count(主键id)count(1)

  • 对于 count(主键id) 来说,InnoDB 引擎会遍历整张表,把每一行的 id 值都取出来,返回给 server 层。server 层拿到 id 后,判断 id 不为 NULL 的,就按行累加
  • 对于 count(1) 来说,InnoDB 引擎遍历整张表,但不取值。server 层对于返回的每一行,放一个数字 “1” 进去,判断是不可能为空的,按行累加
  • 总的来说,count(1) 执行得要比 count(主键id) 快一些。因为从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作

count(*)count(字段)

count(字段)

  • 如果这个 “字段” 定义为 not null,一行行地从记录里面读出这个字段,判断不可能为 null,按行累加
  • 如果这个 “字段” 定义为 null,那么执行的时候,判断到有可能是 null,还要把值取出来再判断一下,不是 null 才累加

count(*)

count(*) 是例外,优化器专门对其做了优化,并不会把全部字段取出来,而是直接按行累加

按照效率排序,count(字段) < count(主键id)< count(1)count(*),所以尽量使用 count(*) 就行了

count() 的优化

如果 count() 的括号中定义了列名或其它表达式,count 就会统计这个表达式有值的次数,不会统计 null

count 的另一种形式就是统计结果中行的数量,当 mysql 知道括号中的表达式永远都不会为 NULL 的时候,它就会按这种方式工作。例如 count(*),它是 count 的一种特例,它不会把通配符 * 展开成所有的列,而是忽略所有的列并统计行数

一个最常见的错误就是,在括号内指定了一个列却希望统计结果集的行数。如果希望知道的是结果集的行数,最好使用 count(*),这样写意义清晰,性能也会很好

  • 对于 MyISAM 存储引擎,当在单表中没有限定 where 查询条件时 count(*) 是非常快的,因为 MyISAM 本身已经在磁盘上存了这个行数总值,但是当存在 where 限定条件,是需要进行查询统计的
  • 为什么 InnoDB 不跟 MyISAM 一样,也把数字存起来呢? 这是因为即使是在同一个时刻的多个查询,由于多版本并发控制(MVCC)的原因,InnoDB 表“应该返回多少行”对于不同的查询也是不确定的。InnoDB 引擎执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,每一行记录都要判断自己是否对这个会话可见,然后累积计数。因此对于 count(*) 请求来说,InnoDB 只好把数据一行一行地读出依次判断,可见的行才能够用于计算“基于这个查询”的表的总行数

count() 的优化

  • 简单的优化:如果只需要近似值,那么使用 EXPLAIN 出来的优化器估算的行数 rows 就是一个不错的近似值,执行 EXPLAIN 并不需要真正地去执行查询,所以成本很低
  • 更复杂的优化:通常来说,count() 都需要扫描大量的行(意味着要访问大量数据)才能获得精确的结果,因此是很难优化的。mysql 层面能做的通常只有是覆盖索引了,尽量通过索引来统计数量,或者单独使用一个汇总表来统计,或者增加一个外部的缓存系统用来计数

转载:https://blog.csdn.net/weixin_43767015/article/details/119904067?spm=1001.2014.3001.5501

mysql中count(*)、count(1)和count(字段)的区别相关推荐

  1. mysql中双引号和单引号有什么区别

    mysql中双引号和单引号有什么区别 前2天看到有人问,mysql中双引号和单引号有什么区别? 希望大家可以关注下公众号,支持一下,鞠躬感谢~ 我就直接po代码和截图了,如下 select * fro ...

  2. mysql 中 RC、RR隔离级别的原理及区别

    今天分享 mysql 中 RC.RR隔离级别的原理及区别: 1.首先简介mysql四种隔离级别: 1)未提交读(READ UNCOMMITED)脏读 2) 已提交读 (READ COMMITED)简称 ...

  3. Mysql中where 1=1 和count(0) 使用小技巧

    1. 数据库语句 where 1=1 的用法和作用 这是一种怎样的查询语句呢?首先说明,1=1不是查询语句中的任何关键词,所以,请您放心,不管你会不会使用 这种语句,都没有任何关系,对于您而言,没有任 ...

  4. MySQL中的升序降序以及字段的升序降序

    MySQL中 升序为asc 降序为desc 例如: 升序:select   *  from  表名 order by  表中的字段 asc(MySQL中默认是升序排列,可不写) : 降序:select ...

  5. MySQL中的哥哥表、妹妹字段,是什么鬼?

    原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处. 晚上,我被叫进宽大的办公室,总监正在煮茶.高压锅煮着长嘴茶壶,水蒸气缭绕.领导举手之间,淡黄茶水奔涌而出,倒立而下浇上茶叶 ...

  6. mysql中nchar_浅谈SQL Server、MySQL中char,varchar,nchar,nvarchar区别

    1,定义: char:    固定长度,存储ANSI字符,不足的补英文半角空格. nchar:   固定长度,存储Unicode字符,不足的补英文半角空格 varchar:  可变长度,存储ANSI字 ...

  7. MySQL中 int(11)和int(10)有没有区别

    引言 依稀还记得有次面试,有面试官问我int(10)与int(11)有什么区别,当时觉得就是长度的区别吧!面试官最后也没有给反馈,我也就以为自己答对了.直到有一次有个同学又跟我谈起这个事,才去查了以下 ...

  8. mysql中时间类型datetime,timestamp与int的区别

    在mysql中存储时间,我们可以用datetime 格式,timestamp格式,也可以用int格式.那么我们设计的时候该如何考虑呢? 首先,我觉得应该明白这几个格式究竟是如何的,然后看看他们的区别, ...

  9. mysql中的BIT_LENGTH和LENGTH以及CHAR_LENGTH的区别

    mysql中获取字符的长度的常见函数有以上三种,他们的区别在于衡量长度的单位是不同的. 目录 背景描述 mysql中长度函数描述 使用案例 背景描述 ASCII码 因为计算机是美国人发明和最早使用的, ...

  10. 字段类型:mysql中int(3)与int(11)有什么区别吗?优化数据库字段占据磁盘的大小

    文章目录 案例 数值类型 日期和时间类型 字符串类型 案例 int(M) 注意:这里的M代表的并不是存储在数据库中的具体的长度,以前总是会误以为int(3)只能存储3个长度的数字,int(11)就会存 ...

最新文章

  1. phoenix 开发API系列(三)phoenix api 结合数据库
  2. zephir开发的扩展“wudimei框架”之数据库使用方法
  3. 分布式系统原理 之6 两阶段提交协议
  4. 32位md5解密_冰蝎特征检测及报文解密
  5. 每天一算法之插入排序
  6. 机器学习面试--决策树
  7. BUG--tomcat更改目录失败
  8. vba mysql 3706_Excel、VBA与MySQL交互
  9. 如何截取QQ密码和聊天内容、去掉QQ广告栏、添加QQ尾巴
  10. EXCEL函数常用技巧浅析
  11. 显卡故障软件测试,显卡软硬件故障检查与排除实战
  12. 电动执行器平时应该怎么去维护和保养?
  13. Ubuntu虚拟机下载(清华大学开源软件镜像源)
  14. 迅雷 极速版 1.0.35.366
  15. 互联网晚报 |11/23星期三 | 京东高管降薪10%至20%;75%未成年每周游戏少于3小时;惠普宣布未来三年裁员4K-6K人...
  16. Python|计算圆柱体的表面积
  17. 数据中台架构体系理解
  18. ActiveX控件的MFC实现(VS2017,OpenGL)
  19. java书籍 李清华_201772020113 李清華《面向對象程序設計(java)》第18周學習總結...
  20. 一文看懂向量的概念及其几何意义

热门文章

  1. 算法:找出存在子字符串的最先位置28. Implement strStr()
  2. 易筋SpringBoot 2.1 | 第三十四篇:Spring Boot导出war包部署到外部Tomcat
  3. OperationQueue与属性maxConcurrentOperationCount的那些事
  4. 做柜员还是程序员_未来的程序员,还是“高薪一族”吗?
  5. python无法打开txt_在Python中打开“.txt”文件
  6. 凸优化第五章对偶 5.5最优性条件
  7. Boost C++ 智能指针
  8. 【生信进阶练习1000days】day1-Bioconductor的一些补充小用法与Working with Genomic Ranges
  9. java点击菜单项弹出对话框_java怎么通过点击菜单弹出对话框
  10. js-01_面向对象选项卡