当前位置: 首页 > news >正文

MySQL数据库调优————GROUP BY及DISTINCT优化

GROUP BY

三种处理GROUP BY的方式

  • 松散索引扫描(Loose Index Scan)
  • 紧凑索引扫描(Tight Index Scan)
  • 临时表(Temporary table)
    三种方式的性能一次递减

松散索引扫描

  • 无需扫描满足条件的所有索引键即可返回结果

我们使用如下索引
在这里插入图片描述
执行SQL

select emp_no,min(salary)
from salaries
group by emp_no;

结果
在这里插入图片描述
当Extra出现Using index for group-by就说明使用了松散扫描。
上面的语句,在执行过程中一般情况下应该是查询出类似[person[i],salary[j]],[person[i],salary[j+1]],[person[i],salary[j+2]]…[person[i+1],salary[k]],[person[i+1],salary[k+1]],[person[i+1],salary[k+2]]…。然后将person[i]的进行计算得到最小的salary,再计算person[i+1]的最小salary,但是索引是有序的,查询出来的语句已经是先按person排序,再按salary排序,也就是说每个person的第一个salary就是最小的,中间的扫描所有每个person的salary并计算最小值的过程是可以省略的直接取每个person的第一个salary即可,这就是松散索引扫描,无需扫描所有的满足条件的索引。

使用松散索引扫描的条件

  • 查询作用再单张表上
  • GROUP BY指定的所有字段要符合最左前缀原则,且没有其他字段
    • 比如有索引index(c1,c2,c3),且有GROUP BYc1,c2则可以使用松散索引扫描;但GROUP BY c2,c3、GROUP BY c1,c2,c4则不能使用
  • 如果存在聚合函数,只支持MIN()/MAX(),并且如果同时使用了MIN()和MAX(),则必须作用再同一个字段。集合函数作用的字段必须再索引中,并且要紧跟GROUP BY所指定的字段
    • 比如有索引index(c1,c2,c3),SELECT c1,c2 MIN(c3),MAX(c3) FROM t GROUP BY c1,c2可以使用松散索引扫描
  • 如果查询中存在除GROUP BY指定的列以外的其他部分,则必须以常量的形式出现
    • SELECT c1,c3 FROM t GROUP BY c1,c2;不能使用
    • SELECT c1,c3 FROM t WHERE c3 = 3 GROUP BY c1,c2;可以使用
  • 索引必须是索引整个字段的值,不能是前缀索引

能使用松散索引扫描的SQL

假设有index(c1,c2,c3)作用再表t(c1,c2,c3,c4)上,下面这些语句都能使用松散索引扫描:

SELECT c1,c2 FROM t GROUP BY c1,c2;
SELECT DISTINCT c1,c2 FROM t;
SELECT c1,MIN(c2)FROM t GROUP BY c1;
SELECT c1,c2 FROM t WHERE c1 < const GROUP BY c1,c2;
SELECT MAX(c3),MIN(c3),c1,c2 FROM t WHERE c2 > const GROUP BY c1,c2;
SELECT c2 FROM t WHERE c1 < const GROUP BY c1,c2;
SELECT c1,c2 FROM t WHERE c3 = const GROUP BY c1,c2;

不能使用松散索引扫描的SQL

– 聚合函数不是MIN()或MAX()
SELECT c1,SUM(c2) from t GROUP BY c1;
– 不符合最左前缀原则
SELECT c1,c2 FROM t GROUP BY c2,c3;
– 查询了c3字段,但c3
字段上没有等值查询
SELECT c1,c3 FROM t GROUP BY c1,c2;

紧凑索引扫描

  • 需要扫描满足条件的所有索引键才能返回结果
  • 性能一般比松散索引扫描差,但是还是可以接受的
explain 
select emp_no,sum(salary)
from salaries
group by emp_no;

结果
在这里插入图片描述
紧凑索引扫描在Extra中是没有特别标识的。

临时表

  • 在无法使用松散索引扫描以及紧凑索引扫描的请款下,MySQL将会读取需要的数据,并创建一张临时表,用临时表实现GROUP BY操作。
explain
select max(hire_date)
from employees
group by hire_date;

结果
在这里插入图片描述
一旦使用了临时表,在Extra中将会出现Using temporary。

GROUP BY的优化

  • 如果GROUP BY使用了临时表,那么就需要想办法用上松散索引扫描或者紧凑索引扫描。

DISTINCT

DISTINCT优化

  • DISTINCT实在GROUP BY操作之后,每组只取一条
  • 和GROUP BY优化思路一致

相关文章:

MySQL数据库调优————GROUP BY及DISTINCT优化

GROUP BY 三种处理GROUP BY的方式 松散索引扫描&#xff08;Loose Index Scan&#xff09;紧凑索引扫描&#xff08;Tight Index Scan&#xff09;临时表&#xff08;Temporary table&#xff09; 三种方式的性能一次递减 松散索引扫描 无需扫描满足条件的所有索引键即可返…...

LRU缓存算法

双向链表哈希表&#xff08;非线程安全&#xff09; https://leetcode.cn/problems/lru-cache/solutions/259678/lruhuan-cun-ji-zhi-by-leetcode-solution/ /*** LRU算法: 哈希表双向链表实现* 1. 双向链表按照被使用的顺序来存储, 靠近头部的节点是最近使用的, 靠近尾部的节…...

@Configuration注解

Configuration注解介绍 Configuration注解&#xff0c;用于标注一个类是一个spring的配置类&#xff08;同时&#xff0c;也是一个bean&#xff09;&#xff0c;配置类中可以使用ComponentScan、Import、ImportResource 和 Bean等注解的方式定义beanDefinition。 Target(Elem…...

基于springboot+vue的食疗系统

基于springbootvue的食疗系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&…...

sklearn学习-朴素贝叶斯

文章目录一、概述1、真正的概率分类器2、sklearn中的朴素贝叶斯二、不同分布下的贝叶斯1、高斯朴素贝叶斯GaussianNB2、探索贝叶斯&#xff1a;高斯朴素贝叶斯擅长的数据集3、探索贝叶斯&#xff1a;高斯朴素贝叶斯的拟合效果与运算速度总结一、概述 1、真正的概率分类器 算法…...

分享112个HTML艺术时尚模板,总有一款适合您

分享112个HTML艺术时尚模板&#xff0c;总有一款适合您 112个HTML艺术时尚模板下载链接&#xff1a;https://pan.baidu.com/s/1D3-mfPOud-f3vy9yLl-bmw?pwdfph2 提取码&#xff1a;fph2 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 时尚平面模特网站模板 潮…...

用GDB远程调试运行于QEMU的程序

1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 测试环境 本文使用 Ubuntu 16.04.4 LTS QEMU 环境进行调试。 3. 用 GDB 调试 QEMU 内程序 3.1 编写用来调试的程序 我们用 ARM32 来进行调试…...

20 堆排序

文章目录1 堆排序的概念2 堆排序基本思想3 堆排序步骤图解说明4 堆排序的代码实现1 堆排序的概念 1) 堆排序是利用堆这种数据结构而设计的一种排序算法&#xff0c;堆排序是一种选择排序&#xff0c;它的最坏&#xff0c;最好&#xff0c;平均时间复杂度均为 O(nlogn)&#xf…...

2023最新文件快递柜系统网站源码 | 匿名口令分享 | 临时文件分享

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 2023最新文件快递柜系统网站源码 | 匿名口令分享 | 临时文件分享 很多时候&#xff0c;我们都想将一些文件或文本传送给别人&#xff0c;或者跨端传递一些信息&#xff0c;但是我们又不…...

分片策略(二)

分片策略 基本概念 分片键 用于分片的字段&#xff0c;是将数据库或表拆分的字段&#xff0c;比如&#xff0c;我可以使用user_id作为分片键将用户数据分到不同的表中&#xff0c;这里的user_id就是分片键&#xff0c;除了这种单字段分片&#xff0c;ShardingSphere还支持多…...

Qt之调色板类QPalette的使用

文章目录QPalette调色板类前言代码知识点讲解QPalette调色板类 前言 Qt提供的调色板类QPalette专门用于管理部件的外观显示&#xff0c;相当于部件或对话框的调色板&#xff0c;管理他们所有的颜色信息。每个部件都包含一个QPalette对象&#xff0c;在显示时&#xff0c;按照…...

Kotlin 32. Kotlin 多语言支持

Kotlin 多语言支持 对于 Kotlin 来说&#xff0c;当我们新建一个项目时&#xff0c;会默认在 values/ 文件夹下&#xff0c;生成一个 strings.xml 文件。比如说&#xff0c; <resources><string name"app_name">exampleNewProject</string> <…...

【Flutter入门到进阶】Dart进阶篇---DartVM单线程设计原理

1 虚拟机的指令执行设计 1.1 虚拟机的分类 基于栈的虚拟机&#xff0c;比如JVM虚拟机 基于寄存器的虚拟机&#xff0c;比如Dalvik虚拟机 1.2 虚拟机的概念 首先问一个基本的问题&#xff0c;作为一个虚拟机&#xff0c;它最基本的要实现哪些功能&#xff1f; 他应该能够模拟…...

Dem和NvM(NVRAM Manager)的交集

NVRAM&#xff08;NvM&#xff09;提供了在NVRAM中存储数据Block的机制。 NVRAM Block&#xff08;最大大小取决于配置&#xff09;被分配给Dem&#xff0c;并由Dem实现事件状态信息和相关数据的永久存储&#xff08;例如通电复位&#xff09;。 ECU 状态管理器&#xff08;Ec…...

AI神经网络CNN/RNN/DNN/SNN的区别对比

@版权声明: 本文由 ChatGpt 创作; BiliBili: https://www.bilibili.com/video/BV17D4y1P7pM/?share_source=copy_web&vd_source=6d217e0ff6387a749dc570aba51d36fd 引言 随着人工智能技术的发展,神经网络作为人工智能的核心技术之一,被广泛应用于图像识别、语音识别、…...

【JavaWeb】一文学会JPA

✅✅作者主页&#xff1a;&#x1f517;孙不坚1208的博客 &#x1f525;&#x1f525;精选专栏&#xff1a;&#x1f517;JavaWeb从入门到精通&#xff08;持续更新中&#xff09; &#x1f4cb;&#x1f4cb; 本文摘要&#xff1a;本篇文章主要介绍JPA的概念、注解实现ORM规范…...

【安卓逆向】APK修改与反编译回编译

【安卓逆向】反编译修改APK回编译使用工具流程步骤Apktool相关安装与使用常用命令备查APK签名命令备查实战练习反编译查看修改的地方使用Apktool反编译得到产物文件夹并进行修改回编APK实用场景在日常开发我们可能需要替换某些资源或者修改某些代码&#xff0c;但是我们没有源码…...

【计组笔记04】计算机组成原理之多模块存储器、Cache高速缓存存储器、Cache地址映射

这篇文章,主要介绍计算机组成原理之多模块存储器、Cache高速缓存存储器、Cache地址映射。 目录 一、双口RAM和多模块存储器 1.1、存取周期 1.2、双口RAM 1.3、多模块存储器...

英语基础-状语的应用

1. 非谓语动词作状语 1. 试着翻译下列句子 当他是一个小孩子的时候&#xff0c;他很喜欢玩电脑游戏。 When he was a child, he liked playing computer games. 如果他通过考试&#xff0c;他妈妈就会给他买一台新电脑。 If he passes the examination, his mother will b…...

发表论文需要注意的两点(建议收藏)

在学习人工智能的过程中&#xff0c;论文有着重要的作用&#xff0c;无论是深入学术科研&#xff0c;还是毕业找工作&#xff0c;都离不开发表论文这一步骤&#xff0c;所以今天就和大家分享一些关于论文发表的经验&#xff0c;希望对大家有所帮助。 为什么要早点发表论文&…...

5分钟快速上手:Awoo Installer - 你的Switch游戏安装神器

5分钟快速上手&#xff1a;Awoo Installer - 你的Switch游戏安装神器 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 还在为Switch游戏安装而烦恼吗…...

QQ空间历史说说一键导出终极指南:GetQzonehistory完整备份解决方案

QQ空间历史说说一键导出终极指南&#xff1a;GetQzonehistory完整备份解决方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想永久保存QQ空间里的青春记忆&#xff1f;那些深…...

简单4步用Win11Debloat彻底优化Windows 11:新手也能让电脑提速70%

简单4步用Win11Debloat彻底优化Windows 11&#xff1a;新手也能让电脑提速70% 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declu…...

OpenClaw学习助手搭建:Qwen3.5-9B自动整理课程截图笔记

OpenClaw学习助手搭建&#xff1a;Qwen3.5-9B自动整理课程截图笔记 1. 为什么需要自动化笔记整理 作为一名经常需要在线学习的开发者&#xff0c;我长期被一个问题困扰&#xff1a;课程视频中的关键知识点截图&#xff0c;总是散落在桌面或下载文件夹里。手动整理这些截图需要…...

Python实战:利用imageio与PIL打造高效图片转视频工具

1. 为什么需要图片转视频工具&#xff1f; 在日常工作和生活中&#xff0c;我们经常会遇到需要将多张图片合成为视频的场景。比如制作产品演示视频、创建旅行相册、生成数据可视化动画等。手动使用视频编辑软件处理这些需求不仅效率低下&#xff0c;而且难以实现批量自动化处理…...

蓝牙键盘连接难题:如何正确输入PIN码?

1. 蓝牙键盘连接为何需要PIN码&#xff1f; 第一次用蓝牙键盘连接电脑时&#xff0c;很多朋友都会遇到这个让人抓狂的场景&#xff1a;电脑屏幕上突然弹出"请输入PIN码"的提示&#xff0c;但手边的蓝牙键盘根本没法输入数字。这种情况在Windows电脑连接苹果Magic Key…...

open-source-jobs未来发展规划:开源工作平台的愿景与路线图

open-source-jobs未来发展规划&#xff1a;开源工作平台的愿景与路线图 【免费下载链接】open-source-jobs A list of Open Source projects offering jobs. 项目地址: https://gitcode.com/gh_mirrors/op/open-source-jobs open-source-jobs 是一个专注于连接开源项目与…...

老游戏重生记:如何让经典作品在Win11焕发新生?

老游戏重生记&#xff1a;如何让经典作品在Win11焕发新生&#xff1f; 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/DD…...

Pixel Aurora Engine 角色设计作品集:基于提示词工程的奇幻生物生成

Pixel Aurora Engine 角色设计作品集&#xff1a;基于提示词工程的奇幻生物生成 1. 开篇&#xff1a;当像素艺术遇见AI奇幻世界 想象一下&#xff0c;你正在开发一款奇幻题材的RPG游戏&#xff0c;需要设计数十种独特的生物角色。传统方式下&#xff0c;这可能需要美术团队数…...

从零构建:麦克纳姆轮底盘的运动学模型与O-长方形布局解析

1. 麦克纳姆轮基础原理与结构解析 第一次接触麦克纳姆轮时&#xff0c;我被它那酷似"风火轮"的外观吸引了。这种特殊设计的轮子由瑞典工程师Bengt Ilon在1973年发明&#xff0c;如今已成为移动机器人领域的明星组件。让我带你从最基础的物理结构开始&#xff0c;逐步…...