MySQL内部临时表(Using temporary)案例详解及优化解决方法

news2024/11/15 4:45:35

目录

前言

一.场景案例

二、什么是内部临时表?

三、哪些场景会使用内部临时表?

四、内部临时表如何存储?

1)使用内存

2)先使用内存,再转化成磁盘文件

3)直接使用磁盘文件

五、如何优化内部临时表?

1.内部临时表通用的优化方向:

2.Union优化方向:

3.Group By优化方向:

开始的案例看下如何优化

1.使用索引优化group by

2.优化临时表内存配置参数

六、总结


前言

在之前的文章《一条SQL使用order by,引发IO问题》中,针对Using Filesort我们探讨了MySQL的排序策略与优化方向,今天,我们将介绍另一种会导致慢SQL的常见情况,即“Using temporary”,本文我们将带领大家详细探讨此类问题的原因及如何优化。

一.场景案例

在介绍具体内容之前,我们先来看个模拟的案例:

device表(id,device_name,device_type,time)有10万条数据,device_type有50种,device_name有5万种,这两个字段均没有索引

分别按照device_name与device_type进行group by,两类SQL施加相同的并发压力进行观察。

select device_name,count(*) as c from device group by device_name  limit 0,5;
select device_type,count(*) as c from device group by device_type  limit 0,5;

图片

图片

如上图所示可以观察到几个特点:

  • 两类SQL总QPS虽然只有10,但是却将CPU打满,影响到整个实例的性能

  • group by device_name执行时间达到了5秒,性能堪忧

  • CPU打满的根因归到了group by device_name

  • group by device_name比group by device_type多出了绿色代表的converting HEAP to MySIAM事件(5.7开始是converting HEAP to ondisk),而且所占比重不小

  • 两者执行计划相同,都是全表扫描,扫描行数相同,EXTRA字段都是Using temporary; Using filesort

看到这里有些新手同学可能会有些疑问:

  • 扫描行数一样,执行计划一样,为什么group by device_name要慢很多?

  • 多出的converting HEAP to MySIAM是什么意思?

  • Using temporary代表什么含义?

  • 如何优化此类问题?

接下来将通过介绍Using temporary内部临时表相关机制来解答这些问题。

二、什么是内部临时表?

要了解内部临时表,需要先知道临时表,临时表是一种会话级别的数据库对象,它只存在于创建它的数据库连接活动期间。与常规的持久化表不同,临时表在连接关闭或服务器重启后自动消失。MySQL临时表从创建方式上可以分为两种:

  • 外部临时表:用户通过显式的命令执行create temporary table创建的临时表。

  • 内部临时表:与外部临时表对应,并不是用户使用显示命令创建的临时表,而是数据库优化器为了协助复杂SQL的执行而自行创建的临时表,用户可以通过explain命令,在Extra列中,看是否有Using temporary,如果有就是用了内部临时表。

三、哪些场景会使用内部临时表?

该类场景大多是需要进行聚合操作,MySQL使用临时表存储聚合数据,以下场景可能使用内部临时表,具体还需查看执行计划确认。

  • UNION

  • Group BY

  • 使用TEMPTABLE算法、UNION查询、聚合的视图

  • 表连接中ORDER BY的列不在驱动表中的

  • DISTINCT查询并且加上ORDER BY

  • SQL中用到SQL_SMALL_RESULT修饰时

  • 复杂的派生表等

四、内部临时表如何存储?

有同学可能会问MySQL的内部临时表是存放在内存还是磁盘?其实都有可能,总共有三种存储方式

1)使用内存

需要存储数据量不超过配置项tmp_table_size与max_heap_table_size的值。

2)先使用内存,再转化成磁盘文件

当内存无法满足内部临时表存储的数据量时,MySQL会将临时表从内存转到磁盘文件,如果临时数据量庞大可能会导致磁盘容量的异常占用。

下图是group by device_name的toptimizer_trace路径:

  • MySQL先创建了内存的临时表,其location为memory (heap)

  • 然后发现内存不够用,又将数据转到了磁盘,location变成了disk(MyISAM/InnoDB),即通过特定引擎存储到磁盘文件表,此处默认引擎类型不同版本间有差异

  • 另外通过row_limit_estimate可以知道当前内存临时表可存放的行数

3)直接使用磁盘文件

使用SQL_BIG_RESULT 的修饰时会直接使用磁盘文件;另一种是临时表字段中存在 BLOB 或 TEXT 列时也会直接放弃使用内存临时表。

那我们平时针对临时表问题,如何进行监控与评估?

监控指标主要关注两个全局status:

  • created_tmp_tables :每创建一个临时表时会累加1。

  • created_tmp_disk_tables:每一次由内存临时表转为磁盘临时表时会累加1。

评估方式:created_tmp_disk_tables/ created_tmp_tables 比值越大说明磁盘临时表的占比越高,性能越差。

五、如何优化内部临时表?

1.内部临时表通用的优化方向:

  • 减少查询不必要的字段:减小临时表单行数据大小,进而提升内存临时表可存放的数据行数。

  • 调大临时表内存参数:修改系统变量 tmp_table_size 和 max_heap_table_size 的值,让临时表可以使用更多的内存。此处不能盲目调整,需要评估根因SQL使用临时表实际需要的内存大小(row_length*行数),如果略微上调参数即可满足临时表数据量要求可以选择调参验证,如果需要的内存与现有配置相差较大,则需要评估服务器整体内存使用情况,避免OOM。

  • 强制直接使用磁盘临时表:如果临时表的数据不可避免的会很大,可以考虑直接使用磁盘内部临时表,省掉内存临时表转换为磁盘临时表的过程。

2.Union优化方向:

考虑是否需要去重,如果不需要的话可以使用Union ALL代替Union,避免使用内部临时表。

3.Group By优化方向:

  • MySQL8.0之前GroupBy会附带排序,如果没有排序要求可以添加order by null。

  • 借助索引进行Group by聚合操作,可以避免使用内部临时表。

我们再回到开始的案例看下如何优化

1.使用索引优化group by

案例SQL是一个简单的Group BY语句,最直接的优化方式是添加索引,让MySQL利用B+树索引的有序性来加速聚合计算。

alter table device add index idx_name(device_name);

图片

添加索引后的执行计划

可以看到不再全表扫描,而是使用索引,同时EXTRA字段不再是Using temporary; Using filesort,SQL执行时间也回到ms级别。

添加索引后的性能表现

cpu使用率从99%降低到了10%以下,SQL执行时间变成了1秒以内,不再有converting HEAP to MySIAM/desk 事件。

2.优化临时表内存配置参数

并不是所有场景都能很好的使用索引,有些同学会关注不使用索引的情况下如何优化参数,我们依然拿开始的案例来分析参数调优。

我们回顾下上面慢SQL的optimizer_trace,MySQL默认tmp_table_size和max_heap_table_size是的16MB,从打印的trace可知临时表每行411字节共能存放40820行数据;而前面提到device表里device_name的种类是5万种,如果全用内存的话需要411*50000≈19.6MB。

那我们将临时表内存配置参数调整到20M再看下效果:

调大临时表参数后的optimizer_trace

可以发现调整后针对group by device_name语句可以存放51025条数据,不再需要磁盘临时表。

我们来观察下相同压力调整参数后的效果:cpu使用率从99%降低到了25%以下,SQL执行时间变成了1秒以内,不再有converting HEAP to MySIAM/desk 事件,性能提升效果5倍以上

图片

调大临时表参数后的性能表现

六、总结

内部临时表是MySQL用来辅助复杂SQL聚合计算使用的,会优先占用内存。可用内存大小受会话级参数 tmp_table_size 和 max_heap_table_size同时限制,内存不够时会将内存临时表转化为磁盘临时表,也可以通过SQL_SMALL_RESULT修饰来强制只使用磁盘临时表。

常用的优化方式有调整内存参数、大数据量时强制只使用磁盘临时表、Group By等SQL借助索引进行聚合、使用Union ALL替代UNion等。大家可以检查一下业务SQL临时表是否合理,给SQL提提速。

*************************************************************************************************************

实用小工具分享~

本文中我们使用的性能诊断工具是DBdoctor,有SQL性能审核、实例巡检、根因诊断、锁分析等功能,目前可永久免费使用,可关注DBdoctor官网(www.dbdoctor.cn)了解更多详细信息。一键安装包下载链接如下:

https://jhktob.oss-cn-beijing.aliyuncs.com/DBdoctorV3.2.3_20240820_x86.tar.gz

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2084571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Stable Diffusion绘画 | ControlNet应用-IP-Adapter:一致性角色就这么简单

IP-Adapter 更新了全新的模型—FaceID plus V2 版本,同时还支持 SDXL 模型。 FaceID plus V2 版本的优点: 解决任务一致性 一张图生成相似角色 其中,两个 Lora文件 放置在:SD安装目录\models\Lora 两个 bin文件 放置在&#x…

三、IIC 总线协议——1、IIC总线协议介绍

IIC总线协议介绍 1、IIC介绍: Inter Integrated Circuit,同步、串行、半双工通信总线。 2、IIC总线结构图 ① 由时钟线SCL和数据线SDA组成,并且都接上拉电阻,确保总线空闲状态为高电平。 ②总线支持多设备连接,允许…

SSM电动车智能充电桩管理系统 项目源码24481

摘 要 随着社会对环保和可持续发展的关注不断增加,电动车作为清洁能源交通工具受到了广泛关注和推广。然而,电动车充电设施的建设和管理面临着诸多挑战,如充电效率低下、管理繁琐等问题。为解决这些问题,本研究设计开发了一款电…

揭秘无线领夹麦克风五大行业隐秘:音质失真、隐私泄露需警惕!

​无线领夹麦克风是演讲、教学、直播等场合的得力助手,然而市场上品牌众多,产品质量参差不齐,安全隐患层出不穷。作为一名音频设备评测师,我近期入手了多款无线领夹麦克风进行测评,下面就来为大家揭秘无线领夹麦克风行…

Jupyter Notebook详细教程

1、Ipython介绍 介绍 科学计算标准工具集的组成部分 IPython是一个免费、开源的项目,支持Linux、Unix、Mac OS X和Windows平台,其官方网址:Jupyter and the future of IPython — IPython IPython中包括各种组件,其中的两个主要…

无盘设计及其在Allegro中的具体操作

无盘设计的好处有两点: 去掉焊环后,增加了孔与线或是其它孔的间距; 去掉焊环后,铜皮避让的面积更少了,增加了铺铜平面的完整性。 一、确定通孔/过孔焊盘支持去除焊环 只有在封装中勾选了Suppress unconnected internal pads; leg…

AI大模型,互联网的中年革命?人才抢夺白热化,平均工资水平惊呆了……

写在前面 在腾讯股东大会上,CEO马化腾深刻指出,人工智能(AI)并非仅仅是互联网领域十年一遇的机遇,而是一个具有深远影响的、堪比电力发明的工业革命级别的重大机遇。 本文将包括: 1- 行业概览 2- 大模型…

C++必修:bitset的用法与实现

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C学习 贝蒂的主页:Betty’s blog 1. 位图的引入 首先我们来看一道面试题: 给40亿个不重复的无符号整数…

乌龙?揭露2024国自然被刷真相!

8月24日,国自然正式放榜,并且申请项目批准资助通知、不予资助通知以及专家评审意见也已发送到各位申请人手里。 中了的人兴奋庆祝,没中的人气愤懊恼,一遍又一遍的看着评审意见,甚至会质疑一些评审的意见有些 “不合理…

The Power of Scale for Parameter-Efficient Prompt Tuning

系列论文研读目录 文章目录 系列论文研读目录论文题目含义Abstract1 Introduction2 Prompt Tuning5.6.7.8.9.10. 论文链接 论文题目含义 刻度在参数高效快速调优中的作用 Abstract In this work, we explore “prompt tuning,” a simple yet effective mechanism for lear…

(四)Kafka离线安装 - Kafka下载及安装

Kafka官方下载地址:Apache Kafka 这时候下载安装版本。 我这里的安装目录在 /usr/local/ cd /usr/local/# 创建目录 mkdir kafka cd kafka mkdir kafka_log 把下载的压缩包,放入到/usr/local/kafka/目录下,解压。 # 解压 tar -zxvf kafka…

PDF招生简章如何转二维码?

​随着科技的不断发展,招生报名方式也在不断创新。如今,许多学校和企业都采用PDF招生简章来宣传招生。然而,传统的纸质招生简章存在携带不便、易损坏等问题。为了解决这些问题,将PDF招生简章转换为二维码成为了一种趋势。那你知道…

Laravel邮件发送功能的实现的方法和技巧?

Laravel邮件发信功能如何配置?怎么使用Laravel发信? 在现代Web开发中,邮件发送功能是不可或缺的一部分。Laravel框架以其优雅的语法和强大的功能,成为了许多开发者的首选。AokSend将深入探讨如何在Laravel中实现邮件发送功能&…

让甲方看得见服务器资源降本增效-软件开发不仅考虑开发成本也要重视长期的运维成本

这几天有几个开发者朋友问,用Go语言开发后端真能降低服务器成本吗?本文想分享是低成本一种解决方案,我们不讨论谁是世界上最好的开发语言,所以开发者朋友看到对比语言就不要去挣个高低。GoFly社区今天给大家分享我们这几年用下来真…

餐饮点餐外卖到店小程序系统管理

餐饮业主要以到店就餐和外卖方式/部分细分业快递配送、团餐等满足客户购餐消费需要,互联网时代,尤其是年轻人无论进店与否都追求快捷方便,商家也要提高自身服务效率。 制作餐饮外卖配送/到店/扫码点餐小程序并可在后台开启设置扫码点餐、到店…

黑神话悟空 PC端配置需求详解:如何为不同游戏体验选择合适的配置?

《黑神话:悟空》是一款备受期待的动作角色扮演游戏,由游戏科学(Game Science)开发,基于《西游记》改编。随着游戏的发布,许多玩家都在关心一件事:我的电脑能带动这款游戏吗?本文将详…

七年老玩家《王者荣耀》分析四:【更新与维护以及防沉迷系统】

目录 更新与维护 王者荣耀日常例行不停机维护的具体时间和内容是什么? 王者荣耀停机维护的历史案例及其对玩家体验的影响如何? 王者荣耀版本更新维护中,T0级英雄调整的标准和流程是什么? 王者荣耀大版本更新的准备工作包括哪些…

vscode链接到远程

点击左下角的绿色按钮选择远程链接成功后左下角会显示远程的名字点击打开文件夹,选择目录进行目录进行编辑

NSSCTF练习记录:[AFCTF 2018]BASE

题目: 根据题目,应为base家族解码,用工具套娃解就可以了

一、基于Vue3的开发-环境搭建【pnpm】安装

基于Vue3开发环境搭建 1、npm 的安装1.1、下载参考地址1.2、安装1.3、设置为国内镜像2、pnpm的安装2.1、启动PowerShell注意事项2.1、 安装2.2、常用命令3、创建项目1、npm 的安装 1.1、下载参考地址 //下载参考地址:https://nodejs.cn/download/#google_vignette下载界面 …