当前位置: 首页 > news >正文

《MySQL学习》 count(*) 原理

一 . count(*)的实现方式

  1. MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count() 的时候会直接返回这个数,效率很高;

  2. 而 InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。

二. InnoDB为什么不存储行数

InnoDB是支持事务的,默认的隔离级别是可重复读。在代码上就是通过多版本并发控制,也就是 MVCC 来实现的。每一行记录都要判断自己是否对这个会话可见,因此对于 count(*) 请求来说,InnoDB 只好把数据一行一行地读出依次判断,可见的行才能够用于计算“基于这个查询”的表的总行数。

三.不同count的用法

对于 count(主键 id) 来说,InnoDB 引擎会遍历整张表,把每一行的 id 值都取出来,返回给 server 层。server 层拿到 id 后,判断是不可能为空的,就按行累加。

对于 count(1) 来说,InnoDB 引擎遍历整张表,但不取值。server 层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加。

对于 count(字段) 来说:如果这个“字段”是定义为 not null 的话,一行行地从记录里面读出这个字段,判断不能为 null,按行累加;如果这个“字段”定义允许为 null,那么执行的时候,判断到有可能是 null,还要把值取出来再判断一下,不是 null 才累加。

但是count(*)是例外,并不会把全部字段取出来,而是专门做了优化,不取值。count(*) 肯定不是 null,按行累加。

按照效率排序 count(*) = count(1) > count(主键) > count(字段)

http://www.lryc.cn/news/14685.html

相关文章:

  • 时间序列数据预测的类型
  • sk_buff结构体成员变量说明
  • springbatch设置throttle-limit参数不生效
  • 用 tensorflow.js 做了一个动漫分类的功能(一)
  • 看完这篇Vue-element-admin,跟面试官聊骚没问题
  • 2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A(5)
  • 基于Java+SpringBoot+Vue+Uniapp前后端分离商城系统设计与实现
  • 新建ES别名 添加别名 切换别名
  • MySQL —— 内外连接
  • EXCEL中文本和数字的相互转换方法
  • React源码分析6-hooks源码
  • Windows10神州网信政府版麦克风、摄像头的使用
  • 微机原理学习总结0:前言
  • LeetCode 1828. 统计一个圆中点的数目
  • Spring Boot + Vue3 前后端分离 实战 wiki 知识库系统<一>---Spring Boot项目搭建
  • leetcode 11~20 学习经历
  • LeetCode 双周赛 98,脑筋急转弯转不过来!
  • 函数的栈帧的创建和销毁
  • python filtermapreducezip
  • Centos7搭建hadoop3.3.4分布式集群
  • 骨传导耳机工作原理,骨传导耳机优缺点
  • IDEA高效插件和设置
  • Linux之网络流量监控工具ntopng YUM安装
  • 创建虚拟机,安装CentOS
  • ilasm 和 ildasm编译和反编译工具介绍使用教程
  • 代码随想录【Day20】| 654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树
  • C++空指针和野指针
  • LinkedList正确的遍历方式-附源码分析
  • 【蓦然回首忆Java·基础卷Ⅱ】
  • Mybatis源码分析系列之第二篇:Mybatis的数据存储对象