首页 > 数据库 >mysql group by 执行原理及千万级别count 查询优化

mysql group by 执行原理及千万级别count 查询优化

时间:2023-11-17 17:47:13浏览次数:52  
标签:count group 索引 文件夹 mysql id dir

大家好,我是蓝胖子,前段时间mysql经常碰到慢查询报警,我们线上的慢sql阈值是1s,出现报警的表数据有 7000多万,经常出现报警的是一个group by的count查询,于是便开始着手优化这块,遂有此篇,记录下自己优化过程中的心得。

优化慢sql前,肯定是要懂sql的查询逻辑,所以我先介绍下group by 语句的执行逻辑。

group by 执行逻辑

环境准备

拿下面这张表举例,这是一张记录文件夹id和用户id关联关系的表。其中dir_id代表文件夹id,uid代表用户id,还有个唯一索引是uniq_dir_id。

create table t_dir_user
(
id bigint unsigned auto_increment
primary key,
dir_id bigint default 0 not null,
uid bigint default 0 not null,
constraint uniq_dir_id
unique (dir_id, uid)
)

表一共有7000多万的数据。下面开始介绍使用group by 语句时sql执行的原理。

没有用到索引的情况

先说下结论,group by后面的列如果不能使用上索引,那么则会产生临时表且很可能产生文件排序的情况。

group by 语句有分 使用到索引和没有使用到索引的情况,先看看没有使用到索引的情况。假如我想查询在一些文件夹范围内,用户关注的文件夹数量。那我可以写出下面这样的sql。

explain select count(1), uid  
from t_dir_user  
where dir_id in (1803620,4368250,2890924,2033475,3038030)  
group by uid;

使用explain分析时,会发现这个查询是使用到索引的,且Extra 那一栏会出现下面的信息。

Using index condition; Using temporary; Using filesort

上述信息代表了查询是使用到了索引来做where条件查询,并且使用到了临时表和文件排序。

注意

标签:count,group,索引,文件夹,mysql,id,dir
From: https://www.cnblogs.com/hobbybear/p/17839342.html

相关文章

  • Linux安装MySQL
    本文使用的Linux发行版本为AlmaLinux9.264位(CentOS停止更新后的完美替代发行版本)。本文安装的MySQL版本为8.1.0,其他版本方法类似。MySQL源码编译时间太长了,需要3到4小时,使用官网编译好的rpm更简单快捷。操作步骤更新系统。dnf-yupdate查看是否已经有安装了的mysql......
  • mysql中删除数据中的特殊字符
    --此字符只影响终端的查询,如crt,xshell等,在navicat中不受影响selectstr,replace(str,char(13),'')asstr_fixfrom(selectconcat('1',char(13),'2')asstr)t1;......
  • mysql 存储过程
    存储过程实例前提准备创建表createtabletable1(namevarchar(10));createtableMatches(idint(10)auto_incrementnotnull,MATCHNOint(5)notnull,TEAMNOVarchar(6)notnull,PLAYERNOint(7)notnull,WONInt(8)notnull,LOSTvarchar(2),primarykey(id));cre......
  • 浅析开源数据库MySQL架构
    数据库是所有应用系统的核心,故保证数据库稳定、高效、安全地运行是所有企业日常工作的重中之重。数据库系统一旦出现问题无法提供服务,有可能导致整个系统都无法继续工作。所以,一个成功的数据库架构在高可用设计方面也是需要充分考虑的。下面就为大家介绍一下如何构建一个高可用的M......
  • 完蛋!? 我被MySQL索引失效包围了!
    前言一阵熟悉的起床闹钟响起,小菜同学醒来竟发现周围都是导致索引失效的原因:性感迷人的索引使用不当、可爱活泼的存储引擎无法识别索引列、刁蛮任性的优化器不选择索引...知其然更要知其所以然,一起来看看索引为啥失效了吧~在阅读文本前,需要知道聚簇索引、二级索引、回表等知识,如......
  • 记一次mysqlbinlog恢复数据库数据
    因为一些意外操作,用旧的备份覆盖了最新的数据库数据,导致最近几天内的数据被覆盖掉了。百度了一圈。。用mysqlbinlog恢复比较靠谱,网上查感觉操作也比较简单。。实际吧。费点劲。。 MySQL的Binlog是用于记录数据库中所有操作的日志文件。通过检查日志文件,可以找到误删除的......
  • MySQL中使用范围查询后索引失效问题
    假设我们为表table的a,b,c三列创建了联合索引createindexidx_a_b_contable(a,b,c),并且在B+树中,数据的存储顺序如下:(a=1b=1c=1)(a=1b=2c=1)(a=1b=2c=3)(a=2b=2c=3)(a=2b=2c=5)(a=2b=5c=1)(a=2b=5c=2)(a=3b=0c=1)(a=3b=3c=5)(a=3b=8c=6)使用查询......
  • MySQL高阶知识点(三):吃透索引【转】
    接着之前总结的:索引概述入门,今天全面讲述一下索引相关知识点1.数据库索引是什么?有什么优缺点?索引是一种能提高数据库查询效率的有序的数据结构。它可以比作一本字典的目录,可以帮你快速找到对应的记录。索引一般存储在磁盘的文件中,它是占用物理空间的。其优缺点如下:优点:加快数......
  • MySQL学习
    cmd打开MySQL:mysql-uroot-pDDL(DataDefinitionLanguage数据定义语言):-数据库操作:查询所有数据库:showdatabases;查询当前数据库:selectdatabase();创建数据库:createdatabase[ifnotexists]数据库名[defaultcharset字符集][collate排序规则];删除数据库:dropdataba......
  • 关于MySQL的一些不常用知识及易错总结
    关于用户当我们刚刚登入数据库时,一般是用root用户登录,然后可以用root用户创建普通用户。注意,此处有权限限制,一般用户无法创建特殊或高权限用户,如root用户。创建用户:createuser'user01'@'localhost'identifiedby'user01';createuser'user01'@'%'identifiedby'user0......