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

在工作中遇到count(*)、count(1)、count(col) ,可能会让你分不清楚,都是计数,干嘛这么搞这么多东西。

count 作用

COUNT(expression):返回查询的记录总数,expression 参数是一个字段或者 * 号。

测试

MySQL版本:5.7.29

创建一张用户表,并插入一百万条数据,其中gender字段有五十万行是为null值的

CREATE TABLE `users` (
  `Id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(32) DEFAULT NULL COMMENT '名称',
  `gender` varchar(20) DEFAULT NULL COMMENT '性别',
  `create_date` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`Id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户表';
复制代码

count(*)

在 MySQL 5.7.18 之前,通过扫描聚集索引来InnoDB处理 语句。SELECT COUNT( *)从 MySQL 5.7.18 开始, 通过遍历最小的可用二级索引来InnoDB处理SELECT COUNT( *)语句,除非索引或优化器提示指示优化器使用不同的索引。如果二级索引不存在,则扫描聚集索引。 大概意思就是有二级索引的情况下就使用二级索引,如果有多个二级索引优先选择最小的那个二级索引来降低成本,没有二级索引使用聚集索引。 下面通过测试来验证这些观点。

  • 首先,在只有Id这一个主键索引的情况下查询执行计划, 在这里插入图片描述 可以看到,type是index也就是使用了索引,key是PRIMARY就是使用了主键索引,key_len=8。
  • 其次在name字段上加上索引,再次使用执行计划查看 在这里插入图片描述 可以看到同样使用了索引,只不过索引用的是name字段的索引,key_len=99。
  • 然后在保留name字段索引的情况下给create_date字段也加上索引,再次查看执行计划 在这里插入图片描述 可以看到这次使用的是create_date字段的索引了,key_len=6。

不管上述是使用了哪个索引,其最后查询到的总行数都是一百万条,无论它们是否包含 NULL值。

count(1)

count(1) 和count(*) 执行查询结果一样,最终也是返回一百万条数据,无论它们是否包含 NULL值。

count(col)

count(col) 统计某一列的值,又分为三种情况:

count(id): 统计id

和count(*) 执行查询结果也是一样,最终也是返回一百万条数据.

count(index col):统计带索引的字段

以count(name)进行查询,执行计划如下:

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

可以看到用的是索引字段进行统计,索引也命中了。 把一列中的name字段置为NULL,再进行count查询,结果返回999999

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

再把这列的NULL值置为空字符串,再进行count查询,结果返回1000000

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

所以,综上简单的使用索引字段统计行数能够命中索引,并且只统计不为NULL值的行数。

count(normal col):统计不带索引的字段

统计不带索引的字段的话就不会使用索引,而且也是只统计不为NULL值的行数。 在这里插入图片描述

count(1)和count(*)取舍

之前也不知道在哪看到的或听说的,count(1) 比count(*) 效率高,这是错误的认知,官网上有这么一句话,InnoDB handles SELECT COUNT( *) and SELECT COUNT(1) operations in the same way. There is no performance difference. 翻译过来就是,InnoDB以同样的方式处理SELECT COUNT( *)和SELECT COUNT(1) 操作,没有性能差异。

对于MyISAM表, 如果从一个表中检索,没有检索到其他列并且没有 子句,COUNT(*)则优化为非常快速地返回 ,此优化仅适用于MyISAM 表,因为为此存储引擎存储了准确的行数,并且可以非常快速地访问。 COUNT(1)仅当第一列定义为 时才进行相同的优化NOT NULL。—-来自MySQL官网 这些优化都是建立在没有where 和 group by的前提下的。

阿里开发规范中也提到 在这里插入图片描述 所以在开发中能用count(*) 就用count( *).

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/6613

(0)
郭靖的头像郭靖
0 0
Docker安装部署Redis数据库
上一篇 2023年1月11日 下午4:36
docker搭建ELK日志平台
下一篇 2023年1月13日 下午3:10

相关推荐

  • Sql Server数据库显示中文乱码的解决方案 数据库运维

    Sql Server数据库显示中文乱码的解决方案

    .数据库中文乱码原因 1. 一种情况是实际生产环境的电脑并不支持中文语言,但是数据库的数据表里面,有些说明字段需要用中文显示,这个时候就出现了乱码了 2. 另外一种情况是,安装数据库的时候,使用的是默认的编码规则。这个时候如果电脑本身就不支持中文语言。然后数据库表里面录入中文,也会出现乱码。支持中文的电脑,安装使用默认的选项,数据表录入中文,好像没有出现过乱…

    郭靖的头像 郭靖
    2023年2月18日
    523 00
  • MySQL配置文件参数详解 数据库运维

    MySQL配置文件参数详解

    设定MySQL事务是否自动提交,1表示立即提交,0表示需要显式提交。作用范围为全局或会话,可用于配置文件中(但在5.5.8之前的版本中不可用于配置文件),属于动态变量。 设定MySQL服务器是否为存储例程的创建赋予其创建存储例程上的EXECUTE和ALTER ROUTINE权限,默认为1(赋予此两个权限给其创建者)。作用范围为全局。 当MySQL的主线程在短…

    郭靖的头像 郭靖
    2022年8月16日
    538 00
  • Oracle报错:ORA-00257 错误处理 数据库运维

    Oracle报错:ORA-00257 错误处理

    一、错误描述 使用plsql develop工具登录数据库时,有如下报错: ORA-00257:archiver error. Connect internal only. unitl freed. 二、错误原因 archive log 日志已满 三、处理方法 1.用sys用户登录 2.查看archivlog所在位置 3.VALUE为空时,可用archive…

    郭靖的头像 郭靖
    2023年3月25日
    313 00
  • Oracle 日期时间查询 数据库运维

    Oracle 日期时间查询

    查询近一个月的数据: 表示创建日期 CREATE_DATE 大于等于当前日期向前推1个月,即近一个月的数据。 Oracle根据当前时间查询前7天的数据: Oracle数据库日期范围查询有两种方式:to_char方式和to_date方式,我们通过一个实例来介绍这一过程。我们假设要查询2022-05-02到2022-05-30之间的数据,实现方式如下: to_d…

    郭靖的头像 郭靖
    2023年3月25日
    475 00
  • 关于mysql now()显示的时间不正确 数据库运维

    关于mysql now()显示的时间不正确

    如果MySQL中的NOW()函数返回的时间不正确,可能有以下几个原因: 时区设置不正确。请使用SELECT @@global.time_zone;命令检查MySQL服务器的全局时区设置,并确保它与你所在地区的时区匹配。如果时区设置不正确,请使用SET GLOBAL time_zone = ‘timezone’;命令进行更正。 系统时间…

    郭靖的头像 郭靖
    2023年8月22日
    673 00

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

最新发布

  • Docker部署漏洞扫描工具Nessus

    Docker部署漏洞扫描工具Nessus

    2024年9月19日

  • 麒麟系统/boot下文件全部丢失,系统无法启动

    麒麟系统/boot下文件全部丢失,系统无法启动

    2024年7月5日

  • IP addr添加网络的使用

    IP addr添加网络的使用

    2024年7月5日

  • mysql之数据旧表导新表

    mysql之数据旧表导新表

    2024年7月4日

  • mysql之两个db实例中有两个表对比

    mysql之两个db实例中有两个表对比

    2024年7月4日

  • 小型企业网络组网与配置仿真实验

    小型企业网络组网与配置仿真实验

    2024年7月3日

  • linux之运维性能命令

    linux之运维性能命令

    2024年7月3日

  • 如何修改ftp服务器密码,ftp密码,3种修改ftp密码的方法

    如何修改ftp服务器密码,ftp密码,3种修改ftp密码的方法

    2024年7月2日

  • Pmail——仅用一分钟就可以搭建好一个邮箱服务器

    Pmail——仅用一分钟就可以搭建好一个邮箱服务器

    2024年7月2日

  • 使用 B VPS 中转 A VPS 流量

    使用 B VPS 中转 A VPS 流量

    2024年6月28日

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信

玻璃钢生产厂家玻璃钢人像雕塑利润怎么样贵州环保玻璃钢雕塑方法宏骏玻璃钢雕塑西安定制玻璃钢雕塑长沙玻璃钢雕塑订制广州天河商场美陈温州玻璃钢雕塑摆件价钱淮安玻璃钢海豚雕塑价格深圳玻璃钢雕塑哪家便宜张家港玻璃钢雕塑造型贴金顺义区专业的商场美陈沈阳仿铜玻璃钢雕塑玻璃钢仿铜运动人物雕塑定做山西抽象玻璃钢雕塑供应商商场动物美陈图片大全佛山玻璃钢花盆图片玻璃钢绿植雕塑厂家潮州玻璃钢昆虫雕塑厂绍兴步行街玻璃钢雕塑多少钱河北康大玻璃钢雕塑长沙户内玻璃钢雕塑销售电话常德玻璃钢游乐场门头雕塑济南玻璃钢农耕雕塑十堰玻璃钢商场美陈宜兴商场中秋美陈商业街玻璃钢雕塑工厂玻璃钢雕塑仿真水果蔬菜艺术商场美陈厂家直销西安大型玻璃钢雕塑销售电话浙江大型玻璃钢雕塑摆件香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化