MySQL之count(1)和count(*)的区别

2023-10-27

闲扯

很久以前,有一次我写了一个SQL:

select count(*) from test;

然后这个代码被我的其中一家公司的MySQL专家看到了,叫我过去说:

你难道不知道咱们不允许写count(*)吗?你不知道count(1)更快吗?

说完二话没说把我的SQL改了。

我自然是惴惴不安。

谁对谁错

先说结论,我是对的,count(*)不但不慢,count(1)也会和count(*)走一样的执行计划。

我们先看这个表:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `xid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `xid` (`xid`)
) ENGINE=InnoDB;

现在看看count(*)的执行计划:

可以看到,这里出现了索引覆盖,也就是说优化器选择了xid这个索引进行了覆盖。

那么看看count(1)的执行计划:

结果是完全一样的。其实优化器现在是很智能的,不会因为你写了count(1)它就能出现什么黑科技,还是老老实实的一行一行在索引上统计,但是好处是不用二次回表检索了。

那么如果是count某个列呢?

我们首先给这个表里插入一条奇怪的数据:

insert into test(xid) values (null);

这个时候执行

select count(xid) from test;

结果也是很奇怪:

明显有问题,count(*)的结果是11。

看看执行计划:

可以看到还是索引覆盖的,而且真的扫描了11行。

MySQL在处理这种count(columnName)的时候会自动的把为null的列忽略掉,因此带来了看似不正确的结果。

《高性能MySQL》上关于NULL的论述中专门提到了,对于要索引的列,最好设置成not null。

这个现象也是该论调的一个有力证明。

写给杠精

可能有人会问,如果这个表上没有二级索引呢?岂不是count(1)更快?

其实不是这样的,我把表的索引去掉,这是现在的表结构:

这是两种SQL的执行计划:

还是完全一样。

其实想想,如果Oracle自己都发现了这个奇技淫巧,那么他们的工程师也会对这个进行优化的。

结论

直接count(*)就好,count(1)快这个论调就是个MySQL日常迷信。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL之count(1)和count(*)的区别 的相关文章

随机推荐

  • Java: 断言(assert)

    断言 assert 语句一般用于程序不准备通过捕获异常来处理的错误 例如 账号交易时 对于支出的金额为正数 收入 支出 纯收入 或者收入的金额为负数 程序必须立即停止执行 同时发现错误 当正式收益时 就可以避开错误 但仍保留断言语句在程序中
  • 6.28同花顺笔试

    笔试共22题 题型比较多 选择 简答 编程 开放逻辑题都有 笔试时长2h 对深度学习方面考察的比较多 包含性能评价指标 常见定义等 选择题与简答题 1 提高深层神经网络特征表达能力的方法 题目问的下列哪个方法无法用来提高 a 增加层深度 b
  • 微信小程序遇到does not have a method “xxxx“ to handle event “tap“

    刚开始学小程序的小白 学到事件绑定的时候 跟着老师的步骤一步一步把代码输入好 结果发现和老师的结果不大一样 我在网上找了很多方法 有说多打空格的 有说要写进method 里的 都试过 没用 结果意外之下 我随手取消勾选 将JS编译成ES5
  • 2022.08 VMware官网下载安装+配置Linux虚拟机,最新最全

    前言 文章概要叙述 步骤一 安装VMware VMware 安装包下载 VMware官方下载页面 1 1小节 步骤二 配置虚拟机 步骤三 安装操作系统 CentOS7 9 镜像文件下载 CentOS阿里云镜像下载页 2 2 1小节 一 VM
  • UE4 获取目录下所有的图片转换成Texture2D并通过UMG显示出来

    主要内容 本文主要讲解简单插件的编写 将类继承至Subsystem 子系统 框架的好处 鼠标射线检测以及鼠标拖拽功能的实现 实现步骤 一 编写插件 1 首先新建一个空的C 项目 然后新建插件 Author是作者名 Description是描
  • 《Linux入门与基础》课程教案

    Linux入门与基础 linux的目录结构 打开终端 输入ls查看linux根目录下的情况 ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sy
  • 常用电路设计之分频器的设计

    引言 分频器在实际数字电路设计中是最基础的 也是最重要的 常见的分频器主要有偶数倍分频器 奇数倍分频器 半整数倍分频器 任意小数倍分频器等 本文主要对最常用的偶数倍分频器和奇数倍分频器展开介绍 1 偶数倍分频器 偶数倍分频器通过计数器可以很
  • uniapp自定义tabbar,中间凸起(支持H5、微信小程序)

    最近公司需要做一款app 需要中间按钮凸起 在网上找了一些 参考文献 做了一个demo H5效果图如下 小程序效果图如下 目录结构如下 page json的配置如下 pages path pages index index style na
  • 面试:字符串: 提取IP地址

    题目 给定一个只含数字的字符串 返回所有合法的ip地址 算法 ip地址是4段 每段三个情况 1 只取一个数字 2 取两个数字 第一个数字不是0 3 取三个数字 第一个数字不是0 而且三个数组成的数小于256 递归 import java u
  • React前端渲染优化--父组件导致子组件重复渲染的问题

    1 适用场景 当父组件本身状态更新时 这个状态并没有作为props传给子组件 也会触发子组件更新机制 这样就造成了组件重复渲染的问题 2 解决 类组件 pureComponent 它是一个类 组件继承自它后 其作为子组件时 每次父组件更新后
  • 数据库视图、触发器

    1 delete和truncate区别 在有自动增长的前提上 用delete清空表后再插入数据 id会从被删除的最大的id 1开始 用 truncate清空表后再插入数据 id会从起始值开始 2 索引 唯一索引 已存在表 alter tab
  • 【C++简明教程】找数组或者Vector中最大最小值的索引

    导言 今天带来的程序是找出数组或者 Vector 中最大最小值的索引 在 Python 中 我们可以使用 numpy 库快速实现 那接下来就看看 C 是怎么实现的吧 主要使用到的函数是 max element 和 min element 基
  • 小程序自定义头部,返回按钮,指定返回某页面

    function navback backUrl if Taro getCurrentPages length lt 1 Taro switchTab url pages home home return if backUrl let Pa
  • 多线程的作用

    1 发挥多核CPU的优势 随着工业的进步 现在的笔记本 台式机乃至商用的应用服务器至少也都是双核的 4核 8核甚至16核的也都不少见 如果是单线程的程序 那么在双核CPU上就浪费了50 在4核CPU上就浪费了75 单核CPU上所谓的 多线程
  • 高性能Mysql——创建高性能的索引

    文章目录 索引类型 高性能的索引策略 独立的列 前缀索引和索引选择性 多列索引 覆盖索引 使用索引扫描来做排序 重复索引和冗余索引 索引优化 MRR ICP 索引类型 我们知道 索引的实现有很多种 在Mysql中 索引是在引擎中实现的 所以
  • Spring 框架基础(04):AOP切面编程概念,几种实现方式演示

    一 AOP基础简介 1 切面编程简介 AOP全称 Aspect Oriented Programming 面向切面编程 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 核心作用 可以对业务逻辑的各个部分进行隔离 从而使得业务
  • win10远程桌面连接服务器接示内部错误。

    搜出来的解决方案大多是让重置远程设置 这也是微软官方的解决方 案 如下 搜索框中输入 CMD 右键点击命令提示符 选择以管理员身份运行 在管理员运行的命令提示符窗口中执行以下的命令 netsh winsoc reset 奇怪的是我的电脑 重
  • GPT:通用预训练语言模型

    论文标题 Improving Language Understanding by Generative Pre Training 论文链接 https www cs ubc ca amuham01 LING530 papers radfor
  • linux下使用qt ,出现Unable to create a debugging engine问题的解决方法

    在进行调试 qt程序的时 出现了问题 Unable to create a debugging engine 根据百度经验 查看Kits下面的调试工具是否存在 如下图 我的调试工具是存在的 那么不能成功体调试的原因是什么呢 一个stack
  • MySQL之count(1)和count(*)的区别

    闲扯 很久以前 有一次我写了一个SQL select count from test 然后这个代码被我的其中一家公司的MySQL专家看到了 叫我过去说 你难道不知道咱们不允许写count 吗 你不知道count 1 更快吗 说完二话没说把我