我的编程空间,编程开发者的网络收藏夹
学习永远不晚

count(*)很慢的原因是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

count(*)很慢的原因是什么

这篇文章主要介绍“count(*)很慢的原因是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“count(*)很慢的原因是什么”文章能帮助大家解决问题。

以下所有的内容均是基于,mysql 5.7 + InnoDB引擎, 进行的分析。

拓展:

MyISAM 如果没有查询条件,只是简单的统计表中数据总数,将会返回的超快,因为service层中获取到表信息中的总行数是准确的,而InnoDB只是一个估值。

实例

废话不多说,先看一个例子。

以下是一张表数据量有100w,表中字段相对较短,整体数据量不算大。

CREATE TABLE `hospital_statistics_data` (
  `pk_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `id` varchar(36) COLLATE utf8mb4_general_ci NOT NULL COMMENT '外键',
  `hospital_code` varchar(36) COLLATE utf8mb4_general_ci NOT NULL COMMENT '医院编码',
  `biz_type` tinyint NOT NULL COMMENT '1服务流程  2管理效果',
  `item_code` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '考核项目编码',
  `item_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '考核项目名称',
  `item_value` varchar(36) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '考核结果',
  `is_deleted` tinyint DEFAULT NULL COMMENT '是否删除 0否 1是',
  `gmt_created` datetime DEFAULT NULL COMMENT '创建时间',
  `gmt_modified` datetime DEFAULT NULL COMMENT 'gmt_modified',
  `gmt_deleted` datetime(3) DEFAULT '9999-12-31 23:59:59.000' COMMENT '删除时间',
  PRIMARY KEY (`pk_id`)
) DEFAULT CHARSET=utf8mb4  COMMENT='医院统计数据';

此表初始状态只有一个聚簇索引

以下分不同索引情况,看一下COUNT(*)的执行计划。

1)在只有一个聚簇索引的情况下看一下执行计划。

EXPLAIN select COUNT(*) from hospital_statistics_data;

结果:

count(*)很慢的原因是什么

这里只关注以下几个属性。

  • type: 这里显示index,说明使用了索引。

  • key:PRIMARY使用了主键索引。

  • key_len: 索引长度8字节。

这里有很关键的一点:count(*)也会走索引,在当前情况下使用了聚簇索引。

好,再往下看。

2)存在一个非聚簇索引(二级索引)

给表添加一个hospital_code索引。

alter table hospital_statistics_data add index idx_hospital_code(hospital_code)

此时表中存在2个索引,主键 hospital_code

同样的,再执行一下:

EXPLAIN select COUNT(*) from hospital_statistics_data;

结果:

count(*)很慢的原因是什么

同样的,看一下 type、key和key_len三个字段。

是不是觉得有点“神奇”。

为何索引变成刚添加的idx_hospital_code了。

先别急着想结论,再看下面一种情况。

3)存在两个非聚簇索引(二级索引)

在上面的基础上,再添加一个二级索引。

alter table hospital_statistics_data add index idx_biz_type(biz_type)

此时表中存在3个索引,主键 、hospital_code 和 biz_type。

同样的,执行一下:

EXPLAIN select COUNT(*) from hospital_statistics_data;

结果:

count(*)很慢的原因是什么

是不是更困惑了,索引又..又又...变了.

变成新添加的idx_biz_type。

先不说为何会产生以上的变化,继续往下分析。

在以上3个索引的基础上,分别看一下,count(1)count(id)count(index)count(无索引)

这4种情况,与count(*)的执行计划有何区别。

  • count(1)

count(*)很慢的原因是什么

  • count(id) 对于样例表来说是,主键是pk_id

count(*)很慢的原因是什么

  • count(index)

这里选取biz_type索引字段。

count(*)很慢的原因是什么

  • count(无索引)

count(*)很慢的原因是什么

小结:

  • count(index) 会使用当前index指定的索引。

  • count(无索引) 是全表扫描,未走索引。

  • count(1) , count(*), count(id) 一样都会选择idx_biz_type索引

必要知识点

  • mysql 分为service层引擎层

  • 所有的sql在执行前会经过service层的优化,优化分为很多类型,简单的来说可分为成本规则

  • 执行计划所反映的是service层经过sql优化后,可能的执行过程。并非绝对(免得有些人说我只看执行计划过于片面)。绝大多数情况执行计划是可信的

  • 索引类型分为聚簇索引非聚簇索引(二级索引)。其中数据都是挂在聚簇索引上的,非聚簇索引上只是记录的主键id。

  • 抛开数据内存,只谈数据量,都是扯淡。什么500w就是极限,什么2个表以上的join都需要优化了,什么is null不会走索引等,纯纯的放屁。

  • 相信一点,编写mysql代码的人比,看此文章的大部分人都要优秀。他们会尽可能在执行前,对我这样菜逼写的乱七八糟的sql进行优化。

原因分析

其实原因非常非常简单,上面也说了,service层会基于成本进行优化

并且,正常情况下,非聚簇索引所占有的内存要远远小于聚簇索引。所以问题来了,如果你是mysql的开发人员,你在执行count(*)查询的时候会使用那个索引?

我相信正常人都会使用非聚簇索引

那如果存在2个甚至多个非聚簇索引又该如何选择呢?

那肯定选择最短的,占用内存最小的一个呀,在回头看看上面的实例,还迷惑吗。

同样都是非聚簇索引。idx_hospital_codelen146字节;而idx_biz_typelen只有1。那还要选吗?

那为何count(*)走了索引,却还是很慢呢?

这里要明确一点,索引只是提升效率的一种方式,但不能完全的解决效率问题。count(*)有一个明显的缺陷,就是它要计算总数,那就意味着要遍历所有符合条件的数据,相当于一个计数器,在数据量足够大的情况下,即使使用非聚簇索引也无法优化太多。

官方文档:

InnoDBhandlesSELECT COUNT(*)andSELECT COUNT(1)operations in the same way. There is no performance difference.

简单的来说就是,InnoDB下 count(*) 等价于 count(1)

既然会自动走索引,那么上面那个所谓的速度排序还觉得对吗? count(*)的性能跟数据量有很大的关系,此外最好有一个字段长度较短的二级索引。

拓展:

另外,多说一下,关于网上说的那些索引失效的情况,大多都是片面的,我这里只说一点。量变才能引起质变,索引的失效取决于你圈定数据的范围,若你圈定的数据量占整体数据量的比例过高,则会放弃使用索引,反之则会优先使用索引。但是此规则并不是完美的,有时候可能与你预期的不同,也可以通过一些技巧强制使用索引,但这种方式少用。

举个栗子:

通过上面这个表hospital_statistics_data,我进行了如下查询:

select * from hospital_statistics_data where hospital_code is not null;

此时这个sql会使用到hospital_code的索引吗?

这里也不卖关子了,若hospital_code只有很少一部分数据是null值,那么将不会走索引,反之则走索引。

原因就2个字:回表

好比去买砂糖橘,如果你只买几斤,那么你随便挑筐里面好的就行。但是如果你要买一筐,我相信老板不会让你在里面一个个挑,而是一次给你一整筐,当然大家都不傻,都知道筐里里面肯定有那么几个坏果子。但是这样效率最高,而且对老板来说损失更小。

执行过程

1.首先在server层维护一个count变量

2.server层向InnoDB引擎要第一条记录

3.InnoDB找到第一条二级索引记录,并返回给server层(注意:由于此时只是统计记录数量,所以并不需要回表)

4.由于COUNT函数的参数是*,MySQL会将*当作常数0处理。由于0并不是NULL,server层给count变量加1。

5.server层向InnoDB要下一条记录。

6.InnoDB通过二级索引记录的next_record属性找到下一条二级索引记录,并返回给server层。

7.server层继续给count变量加1。

8.重复上述过程,直到InnoDB向server层返回没记录可查的消息。

9.server层将最终的count变量的值发送到客户端。

关于“count(*)很慢的原因是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

count(*)很慢的原因是什么

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

下载Word文档

猜你喜欢

count(*)很慢的原因是什么

这篇文章主要介绍“count(*)很慢的原因是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“count(*)很慢的原因是什么”文章能帮助大家解决问题。以下所有的内容均是基于,mysql 5.7
2023-01-31

电脑运行很慢是什么原因

电脑运行缓慢的原因可能有多种,包括以下几个方面:1. 硬件问题:例如电脑内存不足、硬盘空间不足、硬件老化等。2. 软件问题:例如运行过多的后台程序、恶意软件或病毒的存在、软件冲突等。3. 系统问题:例如操作系统过旧、系统文件损坏等。4. 网
2023-09-07

win10开机很慢什么原因

Win10开机很慢的原因可能有多种,以下是一些常见的原因:1. 启动项过多:系统开机时会加载启动项,如果启动项过多,会导致系统启动速度变慢。可以使用任务管理器或第三方启动项管理工具禁用不必要的启动项。2. 硬件问题:硬件问题也可能导致系统启
2023-08-24

pycharm的运行很慢的原因

造成 pycharm 运行缓慢的原因包括:硬件限制:cpu 性能低、内存不足和存储空间不足。软件相关问题:插件过多、索引问题和项目大小过大。项目配置:python 解释器配置不当、文件监视过多和代码分析功能消耗资源过多。PyCharm 运行
pycharm的运行很慢的原因
2024-04-25

linux启动很慢的原因及解决方法是什么

Linux启动慢的原因有很多,常见的包括:1. 系统服务过多:启动时会加载很多系统服务和进程,如果系统服务过多,会导致启动时间延长。解决方法:可以通过禁用一些不必要的服务或者使用更轻量级的替代服务来减少启动时间。2. 硬件配置不足:如果硬件
2023-08-30

ecshop慢的原因是什么

ecshop慢的原因:1、服务器配置不当,ecshop的速度和性能受到服务器配置的影响;2、数据库优化不足,数据库是ECShop的核心组件,存储和处理所有商品信息、订单数据等;3、图片和静态资源过多或过大,如果网页中包含大量图片或其他静态资
2023-07-13

阿里云服务器有时很慢什么原因

阿里云服务器是目前市场上最受欢迎的云计算服务之一,但是有些用户可能会遇到阿里云服务器运行缓慢的情况。本文将分析阿里云服务器运行缓慢的原因,并提供解决方案。1.引言随着云计算技术的不断发展,越来越多的企业和个人开始选择使用阿里云服务器来托管他们的网站、应用程序和数据库等服务。然而,一些用户可能会发现他们的阿里云服务器在某
阿里云服务器有时很慢什么原因
2023-12-31

oracle delete很慢的原因有哪些

Oracle数据库delete语句执行慢的原因可能有以下几个方面:数据量过大:如果要删除的数据量非常大,删除操作会消耗大量的系统资源和时间,导致执行速度变慢。没有索引:如果要删除的数据表没有合适的索引,数据库系统将需要对整个表进行全表扫描,
oracle delete很慢的原因有哪些
2024-04-28

SQL 语句执行很慢的原因

大多数情况是正常的,只是偶尔会出现很慢的情况网络问题数据库在刷新脏页获取锁失败,我们可以用 show processlist这个命令来查看当前的状态刷脏页有下面4种场景(后两种不用太关注“性能”问题):redolog写满了:redo log 里的容量是有限的,
SQL 语句执行很慢的原因
2019-02-04

ubuntu运行很慢的原因有哪些

Ubuntu运行缓慢的原因可能有以下几个方面:1. 系统资源不足:如果计算机的内存(RAM)、处理器(CPU)或硬盘空间不足,会导致系统运行缓慢。2. 运行过多的后台进程:如果后台运行的进程太多,会消耗系统资源,导致系统运行缓慢。3. 桌面
2023-09-07

网页打开慢是什么原因

网页打开慢可能有很多原因,以下是一些常见的原因:1. 网络连接问题:网络连接不稳定、带宽限制、高网络延迟等都可能导致网页打开慢。2. 服务器负载过高:如果访问的网站服务器负载过高,处理请求的速度就会变慢。3. 网页文件大小过大:网页文件包括
2023-08-23

从gitlab上拉取项目很慢的原因

近年来随着互联网的发展,软件开发变得越来越常见和重要。Git作为当前最流行的代码托管平台,拥有着极高的稳定性和可靠性,它广泛运用于各个行业的软件开发过程中。然而,有时候我们会发现从GitLab上拉取项目的速度很慢,这时候我们该如何解决呢?首
2023-10-22

云服务器很卡是什么原因

云服务器很卡可能是由以下几个原因造成的:网络连接不稳定:可能是在访问云服务器时出现了网络不稳定的情况,如网络连接中断或者网速过慢等。建议您尝试重新启动云服务器的网络连接,或者更换其他网络连接进行访问。服务器硬件问题:可能是在使用云服务器时服务器硬件出现了问题,如硬盘故障或者磁盘损坏等。建议您联系云服务器的服务商进行故障排除,以确保云服务器的稳定性。内存或处理器性能下降:可能是因为云服务器
2023-10-26

sqlserver查询突然很慢的原因有哪些

SQL Server 查询突然变慢可能有多种原因,以下是一些常见的原因:索引失效:如果查询涉及的表没有正确的索引,或者索引失效,会导致查询性能下降。硬件故障:服务器硬件故障、磁盘空间不足、内存不足等问题会导致查询性能下降。数据量增大:随着数
sqlserver查询突然很慢的原因有哪些
2024-04-09

windows cpu温度起伏很大的原因是什么

这篇文章主要介绍“windows cpu温度起伏很大的原因是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“windows cpu温度起伏很大的原因是什么”文章能帮助大家解决问题。cpu温度起伏很
2023-06-30

云服务器很卡是什么原因导致的

造成云服务器卡顿的原因有很多,主要包括以下几个方面:硬件故障:当云服务器出现硬件故障时,服务器会出现性能下降、卡顿等问题,这会导致用户无法正常访问云服务器提供的服务。软件问题:云服务器是基于虚拟化技术构建的,需要运行大量的操作系统、应用程序等资源,如果其中的某些软件出现问题,就会导致云服务器卡顿。网络故障:网络故障也是
2023-10-27

gitee网页加载慢是什么原因

Gitee是一个基于Git的代码托管平台,由于其提供的免费服务以及稳定的性能,越来越多的开发者选择在该平台上进行代码管理和版本控制。但是,有时你可能会发现在访问Gitee网站的时候,可能会遇到网页加载缓慢的情况,这是令人非常困扰和不舒适的体
2023-10-22

编程热搜

目录