Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL COUNT性能分析

MySQL COUNT性能分析

作者头像
shysh95
发布于 2022-02-16 13:32:16
发布于 2022-02-16 13:32:16
1K0
举报
文章被收录于专栏:shysh95shysh95

COUNT(*)是如何实现的?

上述的count(*)指的是在查询的时候不加where条件,不加where条件的count(*)在不同的数据库引擎下有不同的实现:

  • MyISAM引擎,会将表的总行数记录在磁盘上,因此count(*)会直接返回个数,效率较高
  • InnoDB引擎,则是需要一行一行的从引擎中读出来,然后累计计数

InnoDB为什么不把总行数存起来?

由于InnoDB的事务支持,同一时刻的多个事务的查询,由于多版本并发控制的(MVCC)的原因,InnoDB表返回的行数是不确定。

InnoDB对COUNT(*)优化?

InnoDB是索引组织表,所有的数据都是通过B+数的方式组织起来的,主键索引的叶子节点是整行数据,普通索引的叶子节点是主键值,因此普通索引树的大小要比主键索引树小的多。对于count(*),MySQL优化器会找到最小的那棵索引树然后进行遍历。

如果某张大表需要经常性的进行count(*)操作,可以考虑单独建立一张表进行保存大表的记录行数。

COUNT的具体含义?

COUNT()是一个聚合函数,对于返回的结果集需要一行一行的进行判断,如果COUNT函数中的参数不为NULL,累计值就加,否则不加。

COUNT的几种用法?

  • COUNT(*)
  • COUNT(主键ID)
  • COUNT(1)
  • COUNT(字段)

COUNT(*)除了在选择索引树遍历上有优化,而且在执行的过程中不会取值,Server层按照行累加。

COUNT(主键ID),InnoDB会遍历整张表,把每一行的ID值都取出来,返回给Server层。Server层拿到ID以后,判断不可能为空,按行累加。

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

COUNT(字段),如果字段定义为NOT NULL的话,Server层从记录中取到字段以后判断不可能为NULL,按行累加;但是如果字段允许为NULL,Server层就有可能取到为NULL的记录,此时需要把记录中的值进行判断一下,不是NULL才可以累加。

COUNT效率

COUNT(字段) < COUNT(主键ID) < COUNT(1) ≈ COUNT(*)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员修炼笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面试官:count(*) 怎么优化?
哈喽,我是狗哥。小伙伴都知道我最近换工作了,薪资、工作内容什么的都是我比较满意的。五月底也面试了有 6、7 家公司,应该拿了有 5 个 offer。这段时间也被问了很多面试题,我打算写一个专题分享出来,希望对你们有所帮助~
JavaFish
2021/07/05
2K1
面试官:count(*) 怎么优化?
浅谈MySQL 统计行数的 count
MySQL count() 函数我们并不陌生,用来统计每张表的行数。但如果你的表越来越大,且是 InnoDB 引擎的话,会发现计算的速度会越来越慢。在这篇文章里,会先介绍 count() 实现的原理及原因,然后是 count 不同用法的性能分析,最后给出需要频繁改变并需要统计表行数的解决方案。
码农编程进阶笔记
2022/08/18
3.2K0
浅谈MySQL 统计行数的 count
MySQL中count(*)、count(主键id)、count(字段)和count(1)那种效率更高?
在select count(?) from t这样的查询语句里面,count(*)、count(主键id)、count(字段)和count(1)等不同用法的性能,有哪些差别。 需要注意的是,下面的讨论
码农编程进阶笔记
2021/07/20
5K0
MySQL中count(*)、count(主键id)、count(字段)和count(1)那种效率更高?
count(*)慢,该怎么办?
使用 select count() from t。计算一个表的行数,比如一个交易系统的所有变更记录总数。随着系统中记录数越来越多,这条语句执行得也会越来越慢。然后你可能就想了,MySQL 怎么这么笨啊,记个总数,每次要查的时候直接读出来,不就好了吗。那么今天,我们就来聊聊 count() 语句到底是怎样实现的,以及 MySQL 为什么会这么实现。然后,我会再和你说说,如果应用中有这种频繁变更并需要统计表行数的需求,业务设计上可以怎么做。
刺槐儿
2023/11/30
3550
Mysql获取数据的总行数count(*)很慢
日常开发中,获取数据的总数是很常见的业务场景,但是我们发现随着数据的增长count(*)越来越慢,这个是为什么呢,
小土豆Yuki
2020/10/23
5.2K0
Mysql获取数据的总行数count(*)很慢
count 浅析
上次打了慢sql日志,发现有很多包含count逻辑的sql,周末抽空来梳理下mysql里的count。
老叶茶馆
2021/03/30
6860
count 浅析
count(*) 的实现方式
这是因为即使是在同一个时刻的多个查询,由于多版本并发控制(MVCC)的原因,InnoDB 表“应该返回多少行”也是不确定的。这里,用一个算 count(*) 的例子来为你解释一下。
Michel_Rolle
2023/07/30
4.2K0
MySQL深入学习第十四篇-count(*)这么慢,我该怎么办?
在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。这时候你可能会想,一条 select count(*) from t 语句不就解决了吗?
越陌度阡
2020/11/26
1.9K0
MySQL深入学习第十四篇-count(*)这么慢,我该怎么办?
count(*) count(id) count(1) count(字段)
count(id)   InnoDB引擎会遍历整张表,把每一行行的id值全部取出来,返回给server层,server层拿到id后,判断是不可能为空的,就按行累加。 count(1)   InnoDB引擎遍历整张表,但不取值,server层对于返回的每一行,放一个数字 1 进去,判断是不可能为空的,累计增加。 count(字段)   1.如果这个字段是定义为not null的话,一行行地从记录里面读出这个字段,判断不能为null,按行累加   2.如果这个字段定义允许为null的话,判断到有可能是null,还要把值取出来在判断一下,不是null才累加。 count(*)   不会把全部的字段取出来,而是做专门的优化,不取值,count(*)肯定不是null,按行累加。
Arebirth
2020/06/19
1.6K0
MySQL几种count比较
网上有很多关系型数据库各种count操作孰优孰劣的文章,如下是曾经写过的有关Oracle和PG中count的文章,
bisal
2022/09/21
2.2K0
count(*) count(1)与count(col)的区别
count(*) 和count(1) 都是统计行数,而count(col) 是统计col列非null的行数
week
2019/06/11
4.5K0
纳尼?MySQL 中 count(*) 比 count(1) 快?
今天有人跟我讲 MySQL 中 count(1) 比 count(*) 快,这能忍?必须得和他掰扯掰扯。
江南一点雨
2022/01/24
1.4K0
纳尼?MySQL 中 count(*) 比 count(1) 快?
干货|MySQL增、删、改查性能优化的10个小技巧
  上一篇介绍了4种进行MySQL性能优化排查的小技巧,本篇就通过从增、删、改、查的语法中如何进行优化,帮助大家更好理解MySQL语法,进行性能优化。
IT学习日记
2022/09/13
1.9K0
干货|MySQL增、删、改查性能优化的10个小技巧
Mysql的SQL性能优化指北
在一次和技术大佬的聊天中被问到,平时我是怎么做Mysql的优化的?在这个问题上我只回答出了几点,感觉回答的不够完美,所以我打算整理一次SQL的优化问题。
大数据真好玩
2020/07/29
9090
MYSQL统计行数时到底应该怎么COUNT
相信每个人在写代码时都有遇到过要获取MYSQL表里数据行数的情况,多数人获取数据表行数时都用COUNT(*),但同时也流传了不少其他方式,比如说COUNT(1)、COUNT(主键)、COUNT(字段)。到底哪种方式MYSQL执行起来更快也是众说纷纭,其实之前我也不知道到底哪个执行起来快,到底谁说的对(笑哭)。好在最近在认真学习极客时间的MySQL专栏,其中专门有一节是对这个问题的讨论,看完后也是解除了长久以来的疑惑。
KevinYan
2019/10/13
1.5K0
2021-Java后端工程师面试指南-(MySQL)
面试指南系列,很多情况下不会去深挖细节,是小六六以被面试者的角色去回顾知识的一种方式,所以我默认大部分的东西,作为面试官的你,肯定是懂的。
用户9927510
2022/07/29
5230
MySQL进阶学习之SQL优化【插入,主键,排序,分组,分页,计数】
如果一次性需要插入大批量数据(比如: 几百万的记录),使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。操作如下:
叫我阿杰好了
2022/11/07
2.3K0
MySQL进阶学习之SQL优化【插入,主键,排序,分组,分页,计数】
【MySQL-26】万字总结<SQL优化>——【插入优化 主键优化 order by优化-group by优化-limit优化-count优化-update优化】
YY的秘密代码小屋
2024/09/09
1330
【MySQL-26】万字总结<SQL优化>——【插入优化 主键优化 order by优化-group by优化-limit优化-count优化-update优化】
聊聊MySQL的COUNT()的性能,看看怎么最快?
基本职场上的程序员用来统计数据库表的行数都会使用count(*),count(1)或者count(主键),那么它们之间的区别和性能你又是否了解呢?
麦洛
2021/05/24
2.9K0
聊聊MySQL的COUNT()的性能,看看怎么最快?
⑩③【MySQL】详解SQL优化
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~
.29.
2023/11/19
2630
⑩③【MySQL】详解SQL优化
相关推荐
面试官:count(*) 怎么优化?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档