MySQL COUNT 函数及其优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL COUNT 优化 MyISAM InnoDB

1、 count()的作用

计数函数,既可以统计某个列的数量又可以统计行数。

统计列Count(col_name),只统计非NULL列( 在 统 计 列 值 时 ( c o u n t ( c o l ) ) , 列 应 该 是 非 空 的 ( N U L L 列 不 会 计 数 );如果列为非空会优化器会将Count(col_name)转换为Count(*) )

统计行Count(*),统计结果集的行数。

2、 * 会检查所有的列?

不是的,当我们使用count(*)的时候,通配符*不会检查所有的列,而是直接统计所有的行数;count(col),当col为非空列时,会转换成count(*)。

3、 count() innodb与myisam对比

    我们现在有两张表class_video和class_video_isam, class_video表存储引擎为innodb,class_video_isam存储引擎为myisam。

class_video:

1.png

class_video_isam:

在数据量都是3162560(300百万)条的场景,执行一下 select count(*) from class_video 和 select count(*) from class_video_isam:

2.png


myisam存储引擎0.001s,innodb存储引擎:23.381s

差别这么大,什么原因?

myisam存储引擎为了存储了这张表的总行数,而innodb需要逐行计数。但是myisam的这么快是有前提:即没有where子句,比如:select count(*) from class_video_isam where course_id=1540;

3.png


执行时间33.522秒。

4.png


4、 如何优化?

4.1 innodb count(*) 无where条件:

  • 增加统计表或者使用缓存。

4.2 有where条件:

  • 分析业务,减少扫描行数。
  • 可以根据该条件建立条件统计表。
  • 如果业务可以接受,那么使用近似行,近似行采用EXPLAIN语句,优化器会预估一个行数。

使用缓存。

5、  总结

  • 行数统计使用Count(*),统计列使用Count(col_name),如果col_name定义为非NULL,那么优化器会自动将Count(col_name)转换为Count(*)。
  • MyISAM和InnoDB计数略有不同,MyISAM直接存储了行数,所有全表行数统计非常快,而InnoDB需要扫描整张表。
  • 优化Count()主要是减少结果集扫描行数,比如:总是使用小的结果集;使用近似值(避免扫描);使用缓存;定时更新;汇总表。
  • 优化Count()还可以组合以上的方式,比如:定时更新,将汇总更新到汇总表,然后将汇总表内容写入缓存。

6、  参考

  1. 高性能MySQL(第三版)
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8天前
|
SQL 关系型数据库 MySQL
MySQL慢查询优化、索引优化、以及表等优化详解
本文详细介绍了MySQL优化方案,包括索引优化、SQL慢查询优化和数据库表优化,帮助提升数据库性能。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
MySQL慢查询优化、索引优化、以及表等优化详解
|
12天前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
39 3
|
14天前
|
关系型数据库 MySQL Serverless
MySQL函数
最常用的MySQL函数,包括聚合函数,字符串函数,日期时间函数,控制流函数等
|
15天前
|
缓存 关系型数据库 MySQL
如何优化 MySQL 数据库的性能?
【10月更文挑战第28天】
38 1
|
22天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万级数据统计优化实践
【10月更文挑战第21天】 在处理大规模数据集时,传统的单体数据库解决方案往往力不从心。MySQL和Redis的组合提供了一种高效的解决方案,通过将数据库操作与高速缓存相结合,可以显著提升数据处理的性能。本文将分享一次实际的优化案例,探讨如何利用MySQL和Redis共同实现百万级数据统计的优化。
57 9
|
16天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
83 1
|
22天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:优化百万数据查询的实战经验
【10月更文挑战第13天】 在处理大规模数据集时,传统的关系型数据库如MySQL可能会遇到性能瓶颈。为了提升数据处理的效率,我们可以结合使用MySQL和Redis,利用两者的优势来优化数据查询。本文将分享一次实战经验,探讨如何通过MySQL与Redis的协同工作来优化百万级数据统计。
49 5
|
27天前
|
存储 关系型数据库 MySQL
优化 MySQL 的锁机制以提高并发性能
【10月更文挑战第16天】优化 MySQL 锁机制需要综合考虑多个因素,根据具体的应用场景和需求进行针对性的调整。通过不断地优化和改进,可以提高数据库的并发性能,提升系统的整体效率。
49 1
|
27天前
|
缓存 关系型数据库 MySQL
一文彻底弄懂MySQL优化之深度分页
【10月更文挑战第24天】本文深入探讨了 MySQL 深度分页的原理、常见问题及优化策略。首先解释了深度分页的概念及其带来的性能和资源问题。接着介绍了基于偏移量(OFFSET)和限制(LIMIT)以及基于游标的分页方法,并分析了它们的优缺点。最后,提出了多种优化策略,包括合理创建索引、优化查询语句和使用数据缓存,帮助提升分页查询的性能和系统稳定性。
|
30天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万数据量的优化实录
【10月更文挑战第6天】 在现代互联网应用中,随着用户量的增加和业务逻辑的复杂化,数据量级迅速增长,这对后端数据库系统提出了严峻的挑战。尤其是当数据量达到百万级别时,传统的数据库解决方案往往会遇到性能瓶颈。本文将分享一次使用MySQL与Redis协同优化大规模数据统计的实战经验。
114 3