在数据库的增删改查操作中,使用最频繁的就是查询操作。而在所有查询操作中,统计数量操作更是经常被用到。

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

COUNT

MySQL官网给出的解释是:

1、COUNT(expr) ,返回SELECT语句检索的行中expr的值不为NULL的数量。结果是一个BIGINT值。

2、如果查询结果没有命中任何记录,则返回0

3、但是,值得注意的是,COUNT(*) 的统计结果中,会包含值为NULL的行数。

例如:

create table #bla(id int,age int)
insert #student values(null,null)
insert #student values(1,null)
insert #student values(null,1)
insert #student values(1,null)
insert #student values(null,1)
insert #student values(1,null)
insert #student values(null,null)

使用语句count(*),count(id),count(id2)查询结果如下:

select count(*),count(id),count(age)
from #student
results 7 3 2

COUNT(常量) 和 COUNT(*)表示的是直接查询符合条件的数据库表的行数。而COUNT(列名)表示的是查询符合条件的列的值不为NULL的行数。

而COUNT(*)是SQL92定义的标准统计行数的语法,因为他是标准语法,所以MySQL数据库对他进行过很多优化。

SQL92,是数据库的一个ANSI/ISO标准。它定义了一种语言(SQL)以及数据库的行为(事务、隔离级别等)。

COUNT(*)的优化

区分不同的执行引擎,MySQL中比较常用的执行引擎就是InnoDB和MyISAM。

MyISAM和InnoDB有很多区别,其中有一个关键的区别和我们接下来要介绍的COUNT(*)有关,那就是MyISAM不支持事务,MyISAM中的锁是表级锁;而InnoDB支持事务,并且支持行级锁。

MyISAM做了一个简单的优化,那就是它可以把表的总行数单独记录下来,如果从一张表中使用COUNT(*)进行查询的时候,可以直接返回这个记录下来的数值就可以了,当然,前提是不能有where条件。

InnoDB中索引分为聚簇索引(主键索引)和非聚簇索引(非主键索引),聚簇索引的叶子节点中保存的是整行记录,而非聚簇索引的叶子节点中保存的是该行记录的主键的值。

所以,相比之下,非聚簇索引要比聚簇索引小很多,所以MySQL会优先选择最小的非聚簇索引来扫表。所以,当我们建表的时候,除了主键索引以外,创建一个非主键索引还是有必要的。

至此,我们介绍完了MySQL数据库对于COUNT(*)的优化,这些优化的前提都是查询语句中不包含WHERE以及GROUP BY条件。

COUNT(1)

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

所以,对于COUNT(1)和COUNT(*),MySQL的优化是完全一样的,根本不存在谁比谁快!

建议使用COUNT(*)!因为这个是SQL92定义的标准统计行数的语法,而且本文只是基于MySQL做了分析,关于Oracle中的这个问题,也是众说纷纭的呢。

COUNT(字段)

最后,就是我们一直还没提到的COUNT(字段),他的查询就比较简单粗暴了,就是进行全表扫描,然后判断指定字段的值是不是为NULL,不为NULL则累加。

相比COUNT(*)COUNT(字段)多了一个步骤就是判断所查询的字段是否为NULL,所以他的性能要比COUNT(*)慢。

总结

本文介绍了COUNT函数的用法,主要用于统计表行数。主要用法有COUNT(*)、COUNT(字段)和COUNT(1)。

因为COUNT(*)是SQL92定义的标准统计行数的语法,所以MySQL对他进行了很多优化,MyISAM中会直接把表的总行数单独记录下来供COUNT(*)查询,而InnoDB则会在扫表的时候选择最小的索引来降低成本。当然,这些优化的前提都是没有进行where和group的条件查询。

在InnoDB中COUNT(*)和COUNT(1)实现上没有区别,而且效率一样,但是COUNT(字段)需要进行字段的非NULL判断,所以效率会低一些。

因为COUNT(*)是SQL92定义的标准统计行数的语法,并且效率高,所以请直接使用COUNT(*)查询表的行数!

数据库COUNT(*)、COUNT(字段)和COUNT(1)的异同相关推荐

  1. MySQL数据库中查询数据库表、字段总数量,查询数据总量

    最近要查询一些数据库的基本情况,由于以前用oracle数据库比较多,现在换了MySQL数据库,就整理了一部分语句记录下来. 1.查询数据库表数量 #查询MySQL服务中数据库表数据量SELECT CO ...

  2. select count(1) 、select count(*) 、select count(字段)的区别、及性能

    select count(*) from teacher; //11 select count(1) from teacher; //11 select count(id) from teacher; ...

  3. 关于sql语句中的count(*),count(1),count(具体字段)的介绍

    在sql语句中有一个聚合函数count():这个函数里面可以写*,可以写数字(不仅仅只可以写1),可以写具体字段,他们之间有什么区别呢? 查阅资料得知,count(*)与count(1)在各种数据库服 ...

  4. 数据库面试题【十九、count(字段) count(主键 id) count(1)count(*)的区别】

    count(可空字段) 扫描全表,读到server层,判断字段可空,拿出该字段所有值,判断每一个值是否为空,不为空则累加 count(非空字段)与count(主键 id) 扫描全表,读到server层 ...

  5. MySQL中count(1),count(*),count(某字段)等用法联系和区别

    一. 从执行结果来看 count(*):所有行进行统计,包括NULL行count(1):所有行进行统计,包括NULL行count(column):对column中非Null进行统计 二. 从执行效率上 ...

  6. count() * ,1,字段 三兄弟

    /COUNT:非空的/ SELECT COUNT(studentname) FROM student; SELECT COUNT(*) FROM student; SELECT COUNT(1) FR ...

  7. mysql中count(*),count(字段),count(1)的区别

    count(主键id) InnoDB 会遍历全表,取每行的主键 id,返回给 server 层,server 层拿到数据后,进行判断累加. count(1) InnoDB 仍遍历全表,但是不取值,se ...

  8. 性能对比:Count(字段)、Count(主键)、Count(1)、Count(*)

    本文经授权转载自微信公众号:猿人谷 最近有几个小伙伴留言说不清楚Count(字段).Count(主键).Count(1).Count(*)的区别,特此写篇短文说明下. 以下讨论是基于InnoDB引擎. ...

  9. count(1)、count(*)、count(字段)的区别

    MyISAM不支持事务,MyISAM中的锁是表级锁:而InnoDB支持事务,并且支持行级锁. count(1):InnoDB 遍历全表,但是不取值,server 层对返回的每一行数据新增一个 1,然后 ...

  10. 【MySQL】count(1)、count(*)、count(字段)、count(主键)的区别

    文章目录 三者的计数方式 三者的执行效果 三者的执行效率 三者的计数方式 count(1): count(1)会统计表中所有的记录数,包括字段为null的记录. count(*): count(*)包 ...

最新文章

  1. python网络爬虫初识_python爬虫(一)初识爬虫
  2. Spring踩坑记录
  3. JavaScript 方法传参
  4. 典型用户描述及进一步需求分析
  5. 再生希尔伯特空间_向量、函数向量、再生核希尔伯特空间、核技巧
  6. php课程设计实验心得,PHP程序设计教程实验及课程设计
  7. 【java笔记】线程间通信(2):生产者和消费者案例分析
  8. Codeforces Round #354 (Div. 2) A. Nicholas and Permutation
  9. python中if name == main_python中if __name__ == '__main__': 的解析
  10. 1、C语言从入门到精通一一概述
  11. Office 2016 简体中文批量授权版镜像下载
  12. ELK:ElasticSearch定期关闭和删除索引脚本
  13. android 画图 工具下载,画板画图软件下载-画板画图 安卓版v1.1.0-PC6安卓网
  14. 【经验分享】如何将拍摄的照片制作成扫描件 PS+WORD教程
  15. 为什么浏览器全面禁用三方 Cookie
  16. 如何在水经注微图中加载地形地貌图进行道路设计
  17. 腾讯裁员范围扩大;研究称人类或能喝到月球冰火水;苹果考虑取消京东方3000万块屏幕订单;近视手术无法治愈近视
  18. 新冠疫情全球数据可视化
  19. Matlab:16进制excel转2进制mat
  20. (01) Apache Felix 入门 - 01

热门文章

  1. upc第十一场2020.11.30
  2. 他一生只做一件事,专注150万农场鸡的鸡蛋销售
  3. ojdbc连接oracle报错:IO 错误: The Network Adapter could not establish the connection
  4. 锆石科技的FPGA教学视频
  5. 固态硬盘与机械硬盘读取速度实测
  6. VML标记与通用属性
  7. 数据库系统---数据挖掘
  8. 2021年的理财收益,2022继续加油
  9. Scrapy——基本用法(命令行工具、Item、Spiders)
  10. 上海杉达学院计算机课程,上海杉达学院计算机科学与技术专业介绍