首页 > 数据库 >Mysql count(*)、count(1)、count(主键)、count(普通字段) 性能对比

Mysql count(*)、count(1)、count(主键)、count(普通字段) 性能对比

时间:2023-12-12 17:33:23浏览次数:36  
标签:count 扫描 主键 索引 Mysql NULL id

count(*): 底层会转化为 count(0) 来处理,默认横向扫描聚集索引树,如果有二级索引就扫描二级索引树(因为二级索引树更小,扫描成本低),扫描到一行记录之后,将该记录返回给 Server 层,由于参数是 0,不为 NULL,所以不需要读取记录中的任何字段,直接将 count 变量加 1

count(1): 处理方式和 count(0) 类似

count(主键 id): 默认横向扫描聚集索引树,如果有二级索引就扫描二级索引树(因为二级索引树更小,扫描成本低),扫描到一行记录之后,将该记录返回给 Server 层,然后 Server 层读取该记录的主键 id 值,判断主键 id 值是否为 NULL,如果不为 NULL,就将 count 变量加 1

count(普通字段): 不会扫描任何索引树,只能全表扫描,然后将该记录返回给 Server 层,然后 Server 层读取该记录的字段值,判断字段值是否为 NULL,如果不为 NULL,就将 count 变量加 1

 

count(*)、count(1)、count(主键 id)

  • 如果没有二级索引的情况下就会横向扫描主键索引
  • 如果存在二级索引的情况下,不会扫描主键索引,转而扫描二级索引(因为二级索引一般情况下,相比于主键索引来说,其占用存储空间更小,性能更高)

count(*) 和 count(1) 的底层处理逻辑类似,性能是相同的

count(主键 id) 扫描到记录之后还会去判断主键 id 是否为 NULL,多了一个读取主键 id 和判断的过程,性能略低于 count(*)

count(普通字段) 只能走全表扫描的方式,不能扫描索引树

只有主键索引的情况下: count(*) = count(0) = count(1) > count(主键 id) > count(普通字段)

有主键索引和二级索引的情况下: count(*) = count(0) = count(1) > count(主键 id) = count(普通字段)

 

标签:count,扫描,主键,索引,Mysql,NULL,id
From: https://www.cnblogs.com/xiaomaomao/p/17897393.html

相关文章

  • MySQL 忘记密码解决方案
    数据库版本5.7.301配置文件中去掉认证编辑my.cnf服务配置文件 [mysqld]段段中加入skip-grant-tables语句2本地root账号免密登陆[root@mysql0006bin]#./mysql-uroot-pWelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis3Serverversi......
  • uniapp+node.js+mysql前后端微信小程序授权登录
    文章目录一、前端代码?1.微信授权登录的页面(没有样式,自己写)2.”我的“页面3.封装request.js的页面4.vuex的状态管理的页面5.添加了识别有放token的没有登录就自动跳转登录的功能的main.js页面二、后端代码1.数据库连接页面(sql.js)2.数据库页面封装查询用户与插入用户信息的页面以及......
  • 【flink番外篇】3、fflink的source(内置、mysql、kafka、redis、clickhouse)介绍及示例(2
    Flink系列文章一、Flink专栏Flink专栏系统介绍某一知识点,并辅以具体的示例进行说明。1、Flink部署系列本部分介绍Flink的部署、配置相关基础内容。2、Flink基础系列本部分介绍Flink的基础部分,比如术语、架构、编程模型、编程指南、基本的datastreamapi用法、四大基......
  • 【flink番外篇】3、flink的source(内置、mysql、kafka、redis、clickhouse)介绍及示例(3)-
    Flink系列文章一、Flink专栏Flink专栏系统介绍某一知识点,并辅以具体的示例进行说明。1、Flink部署系列本部分介绍Flink的部署、配置相关基础内容。2、Flink基础系列本部分介绍Flink的基础部分,比如术语、架构、编程模型、编程指南、基本的datastreamapi用法、四大基......
  • mysql递归查询
     MySQLwithRecursive的作用是基于一组初始数据,进行递归查询,返回符合条件的数据集。这种递归查询方式可以应用在很多场景下,比如对于树形结构、层级结构的数据处理,以及对数据进行分类汇总等。MySQLwithRecursive的使用限制?MySQLwithRecursive的使用限制主要在于查询语句的......
  • centos6.8 使用yum安装 mysql5.7
    配置系统yum源这一步可选,如果yum源使用正常可跳过,由于centos6支持已于2020年停止,安全维护也只支持到2024年11月30日,所以很多原来可用的yum源也失效了,试了几个后找到以下可用的。备份旧配置mv/etc/yum.repos.d/CentOS-Base.repo/etc/yum.repos.d/CentOS-Base.repo.backup......
  • 全网最全,MySQL 增删改查高级命令硬核总结
    MySQL入门教程:全网最全,MySQL增删改查高级命令硬核总结原创 白鹿第一帅 白鹿第一帅 2023-12-0507:00 发表于四川文章目录前言一、连接到MySQL数据库1.1、连接到本机上的MySQL1.2、连接到远程主机上的MySQL二、退出MySQL命令三、修改MySQL密码3.1、先给roo......
  • 将mysql的输出文本写回mysql
    1准备工作1.1环境准备操作系统:MicrosoftWindows10专业工作站版软件版本:Python3.9.6第三方包:pipinstallpandas2.1.0pipinstallpymysql1.1.0pipinstallsqlalchemy==2.0.23Get-WmiObject-ClassWin32_OperatingSystem|Select-Object-PropertyCaptionpython......
  • docker安装mysql
    1.下载mysql镜像#dockerpullmysql:8.0 2.检查下载的镜像#sudodockerimages 3.创建实例dockerrun-p3307:3306--namemysql\-v/mydata/mysql/log:/var/log/mysql\-v/mydata/mysql/data:/var/lib/mysql\-v/mydata/mysql/conf:/etc/mysql\-eMYSQL_ROO......
  • mysql审计之general_log
    一、概述1、配置参数#开启审计日志general_log=on#配置审计日志文件,mysql默认配置的是datadir目录下面,主机名.log的文件general_log_file=/data/mysql/general_log#配置日志输出到文件还是表,默认文件log_output=file2、优势mysql自带,不需要额外安装插件配置参数可以直接......