广告
返回顶部
首页 > 资讯 > 数据库 >聊聊MySQL的COUNT(*)的性能
  • 651
分享到

聊聊MySQL的COUNT(*)的性能

MySQLCOUNT(*) 2022-05-25 21:05:11 651人浏览 薄情痞子
摘要

前言 基本职场上的程序员用来统计数据库表的行数都会使用count(*),count(1)或者count(主键),那么它们之间的区别和性能你又是否了解呢? 其实程序员在开发的过程中,在一张大表上统计总行数是非常耗时的一

前言

基本职场上的程序员用来统计数据库表的行数都会使用count(*),count(1)或者count(主键),那么它们之间的区别和性能你又是否了解呢?

其实程序员在开发的过程中,在一张大表上统计总行数是非常耗时的一个操作,那么我们应该用哪个方法统计会更快呢?

接下来我们就来聊一聊Mysql中统计总行数的方法和性能。

count(*),count(1),count(主键)哪个更快?

建表并且插入1000万条数据进行实验测试


# 创建测试表
CREATE TABLE `t6` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(50) NOT NULL,
 `status` tinyint(4) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# 创建存储过程插入1000w数据
CREATE PROCEDURE insert_1000w()
BEGIN
  DECLARE i INT;
  SET i=1;
  WHILE i<=10000000 DO
    INSERT INTO t6(name,status) VALUES('God-jiang-666',1);
    SET i=i+1;
  END WHILE;
END;

#调用存储过程,插入1000万行数据
call insert_1000w();

分析实验结果


# 花了0.572秒
select count(*) from t6;

在这里插入图片描述


# 花了0.572秒
select count(1) from t6;

在这里插入图片描述


# 花了0.580秒
select count(id) from t6;

在这里插入图片描述


# 花了0.620秒
select count(*) from t6 force index (primary);

在这里插入图片描述

从上面的实验我们可以得出,count(*)和count(1)是最快的,其次是count(id),最慢的是count使用了强制主键的情况。

下面我们继续测试一下它们各自的执行计划:


explain select count(*) from t6;
show warnings;

在这里插入图片描述

在这里插入图片描述


explain select count(1) from t6;
show warnings;

在这里插入图片描述

在这里插入图片描述


explain select count(id) from t6;
show warnings;

在这里插入图片描述

在这里插入图片描述


explain select count(*) from t6 force index (primary);
show warnings;

在这里插入图片描述

在这里插入图片描述

从上面的实验可以得出这三点:

  1. count(*)被mysql查询优化器改写成了count(0),并选择了idx_status索引
  2. count(1)和count(id)都选择了idx_statux索引
  3. 加了force index(primary)之后,走了强制索引

这个idx_status就是相当于是二级辅助索引树,目的就是为了说明: InnoDB在处理count(*)的时候,有辅助索引树的情况下,会优先选择辅助索引树来统计总行数。

为了验证count(*)会优先选择辅助索引树这个结论,我们继续来看看下面的实验:


# 删除idx_status索引,继续执行count(*)
alter table t6 drop index idx_status;

explain select count(*) from t6;

在这里插入图片描述

从以上实验可以得出,删除了idx_status这个辅助索引树,count(*)就会选择走主键索引。所以结论:count(*)会优先选择辅助索引,假如没有辅助索引的存在,就会走主键索引。

为什么count(*)会优先选择辅助索引?

在Mysql5.7.18之前,InnoDB通过扫描聚集索引来处理count(*)语句。

从MySQL5.7.18开始,InnoDB通过遍历最小的可用二级索引来处理count(*)语句。如果不存在二级索引,则扫描聚集索引。

新版本为何会使用二级索引来处理count(*)呢?

因为InnoDB二级索引树的叶子节点上存放的是主键,而主键索引树的叶子节点存放的是整行数据,所以二级索引树比主键索引树小。因此查询优化器基于成本考虑,优先选择的是二级索引。所以索引count(*)快于count(主键)。

总结

这篇文章的结论就是count(*)=count(1)>count(id)

为什么count(id)走了主键索引还会更慢呢?因为count(id)需要取出主键,然后判断不为空,再累加,代价更高。

count(*)是会总计出所有NOT NULL和NULL的字段,而count(id)是不会统计NULL字段的,所以我们在建表的尽量使用NOT NULL并且给它一个默认是空即可。

最后,在以后总计数据库表的总行数的时候,可以大胆的使用count(*)或者count(1)。

参考资料

  • 《高性能MySQL》(第三版)第六章优化COUNT()查询
  • 《MySQL实战45讲》林晓斌

到此这篇关于聊聊MySQL的COUNT(*)的性能的文章就介绍到这了,更多相关MySQL COUNT(*)内容请搜索自学编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持自学编程网!

您可能感兴趣的文档:

--结束END--

本文标题: 聊聊MySQL的COUNT(*)的性能

本文链接: https://www.lsjlt.com/news/9997.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 聊聊MySQL的COUNT(*)的性能
    前言 基本职场上的程序员用来统计数据库表的行数都会使用count(*),count(1)或者count(主键),那么它们之间的区别和性能你又是否了解呢? 其实程序员在开发的过程中,在一张大表上统计总行数是非常耗时的一...
    99+
    2022-05-25
    MySQL COUNT(*)
  • 聊一聊关于MySQL的count(*)
    2. count(*)的实现方式 据说,MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高。 而我们的mysql一般都是用Innodb的引擎,Innodb是怎么实现count操作的呢...
    99+
    2020-12-23
    聊一聊关于MySQL的count(*)
  • 性能神化,聊聊Exadata 的“七宗罪”
    性能神化,聊聊Exadata 的“七宗罪” 什么是Exadata?它跟国内的一些oracle数据库一体机品牌一样,是一套专为Oracle数据库打造的软硬一体化的数据库平台,俗称“数...
    99+
    2022-10-18
  • 聊聊MySQL中的参数
    前言: 在前面一些文章中,经常能看到介绍某某参数的作用,可能有些小伙伴仍搞不清楚 MySQL 参数是啥。本篇文章我们来聊聊 MySQL 参数,学习下如何管理维护 MySQL 参数。 1.MySQL参数概念 我们所说的...
    99+
    2022-05-29
    MySQL 参数
  • 聊聊MySQL事务的特性和隔离级别
    网上对于此类的文章已经十分饱和了,那还写的原因很简单——作为自己的理解笔记。 前言   此篇文章作为自己学习MySQL的一些个人理解,使用的引擎是InnoDb。首先先讲讲事务的概念,在《高性能...
    99+
    2022-05-11
    MySQL 事务 MySQL 事务特性 MySQL 事务隔离级别
  • 聊聊MySQL中的存储引擎
    基础知识    在关系型数据库中每一个数据表相当于一个文件,而不同的存储引擎则会构建出不同的表类型。    存储引擎的作用是规定数据表如何存储数据,如何为存储的数据建立索引以及如何支持更新、查询等技术的实现。    ...
    99+
    2022-05-23
    MySQL 存储引擎 MySQL 存储 MySQL 引擎
  • 从性能方面来聊聊Golang的快慢问题
    Golang作为一种新兴的编程语言,备受程序员们的关注。很多人都在问,Golang快不快?本文将从性能方面来介绍Golang的快慢。首先,我们需要了解Golang是如何运作的。Golang通过触发器的方式来实现垃圾回收,这与其他语言的实现方...
    99+
    2023-05-14
  • 聊聊daos高性能分布式存储
    DAOs(分布式自治组织)是一种新兴的组织形式,它使用区块链技术实现了去中心化的决策和运营。在DAOs中,成员可以通过投票来制定组织...
    99+
    2023-09-21
    分布式存储
  • 详细聊聊MySQL中的LIMIT语句
    目录问题 server层和存储引擎层 那LIMIT是什么鬼? 怎么办? 吐个槽 最近有多个小伙伴在答疑群里问了小孩子关于LIMIT的一个问题,下边我来大致描述一下这个问题。 问题 ...
    99+
    2022-11-12
  • 一文聊聊php5.6的特性【总结】
    本篇文章带大家聊聊php5.6的特性(常量作为函数参数默认值、可变函数参数、命名空间等等),有需要的可以看看,希望对大家有所帮助!更好的常量定义常量时允许使用之前定义的常量进行计算:const A = 2; const B = A + 1;...
    99+
    2022-08-08
    php5.6 php
  • 一文聊聊php5.4的特性【总结】
    本篇文章带大家聊聊php5.4的特性(Short Open Tag、数组简写形式、Traits等等),有需要的可以看看,希望对大家有所帮助!Short Open TagShort Open Tag 自 PHP5.4 起总是可用。在这里集中讲...
    99+
    2022-08-08
    php php5.4
  • 聊聊Vue中的计算属性computed
    一、计算属性computed1.1.什么是计算属性computed⭐⭐ computed 是基于它的依赖缓存,只有在它的相关依赖发生改变时才会进行更新。官方文档是这样说的:对于任何包含响应式数据的复杂逻辑,你都应该使用计算属性。 (学习视频...
    99+
    2022-11-22
    vue3 vue.js Vue
  • 详细聊聊Mybatis中万能的Map
    目录万能的Mapdemomap 实现add usermap 实现通过id查询多个参数可以使用Map进行传参总结万能的Map 假设,我们的实体类,或者数据库中的表,字段或者参数过多,我...
    99+
    2022-11-12
  • 深入聊聊gitee中的极化功能
    随着开源技术的日益发展,越来越多的开发者开始使用Gitee来管理和分享他们的代码。作为一个开发者,如何更好地利用Gitee提高自己的开发效率和项目贡献呢?其中之一就是要学会如何看极化。一、Gitee的极化概念Gitee的极化是指将代码库中的...
    99+
    2023-10-22
  • 一起聊聊C++中的智能指针
    目录一:背景二:关键词解析1. auto_ptr2. auto_ptr 多引用问题一:背景 我们知道 C++ 是手工管理内存的分配和释放,对应的操作符就是 new/dele...
    99+
    2022-11-13
  • 聊聊goxorm生成mysql的结构体问题
    网上很多资源都说是xorm reverse mysql "root:123456@tcp(127.0.0.1:3306)/userscharset=utf8" ....
    99+
    2022-11-13
  • 详细聊聊Oracle表碎片对性能有多大的影响
    目录前言⛳️1.创建测试表1.1建立表空间1.2创建ASSM表空间1.3创建表及索引⛳️2.查看表统计信息⛳️3.空块占用空间⛳️4.查看执行计划⛳️5.删除大量数据⛳️6.再次查看...
    99+
    2022-11-13
  • 聊聊Flare应用前后端性能优化问题
    目录写在前面应用性能问题分析对于我不适用的功能前端架构中的问题后端架构中的问题针对应用进行改进调整前端实现调整后端实现图标资源优化容器镜像的优化额外的优化最后两周前,在给颜值在线的&...
    99+
    2022-11-13
  • 详细聊聊vue中组件的props属性
    目录问题一:那props具体是怎么使用呢?原理又是什么呢?往下看问题二:那如果我们想给年龄加1岁,怎么实现?问题三:对于年龄这一类型,我们最希望拿到的是什么数据类型?问题四:可以限制...
    99+
    2022-11-12
  • 聊聊GitLab关闭部分功能的背景
    随着越来越多的开发者使用GitLab来管理其代码库,GitLab作为一款领先的源代码管理平台,也逐渐成为了软件行业的核心工具之一。但是最近,GitLab宣布关闭部分功能以提高服务稳定性和安全性,引起了广泛关注。本文将详细介绍GitLab关闭...
    99+
    2023-10-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作