【mysql进阶】4-8 临时表空间

临时表空间 - Temporary Tablespaces

image-20241026220857875

1 什么是临时表?

✅ 解答问题

  • 临时表存储的是临时数据,不能永久的存储数据,⼀般在复杂的查询或计算过程中⽤来存储过渡的中间结果,MySQL在执⾏查询与计算的过程中会⾃动⽣成临时表,⽐如表连接查询时得到的结果集就是⼀张临时表,因为结果中可能包含多个表中的字段并没有⼀张真实的表与之完全对应。

1.1 除了系统⾃动创建的临时表,可以⼿动创建临时表吗?

  • ⽤⼾可以通过使⽤ CREATE TEMPORARY TABLE 语句⼿动创建临时表

  • ⽤⼾创建的临时表也称为外部临时表;MySQL在执⾏查询与计算的过程中⾃动⽣成的临时表称为内部临时表。

2 什么是外部临时表?

🔍 分析过程

  • 使⽤ CREATE TEMPORARY TABLE 语句创建的临时表是外部临时表
# 创建⼀个名称为t1的临时表
CREATE TEMPORARY TABLE t1 (c1 INT PRIMARY KEY) ENGINE=INNODB;
  • 通过 INNODB_TEMP_TABLE_INFO 查询临时表元数据

image-20241026222253354

  • TEMPORARY 表只在当前会话中可⻅,并且在会话关闭时⾃动删除。这意味着两个不同的会话可以使⽤相同的临时表名,⽽不会相互冲突,临时表也不会与已有的⾮临时表名冲突,如果创建了与现有表同名的临时表,则现有表被隐藏,直到临时表被删除。

  • 重启MySQL服务器后,再次查询临时表信息,得到空集合

image-20241026222333951

✅ 解答问题

  • 使⽤ CREATE TEMPORARY TABLE 语句创建的临时表是外部临时表,表只在当前会话中可⻅,并且在会话关闭时⾃动删除

3 什么是内部临时表?

🔍 分析过程

  • 由服务器⾃动创建的临时表是内部临时表
  • 服务器在以下情况会⾃动创建临时表,这个过程⽤⼾不能直接控制:
    • 使⽤ UNION 语句合并查询结果
    • 对视图时的⼀些操作,⽐如使⽤ UNION 或聚合函数
    • 使⽤⼦查询
    • 使⽤ DISTINCT 和 ORDER BY 的查询可能需要⼀个临时表
    • 使⽤ INSERT…SELECT 语句向表中写⼊数据时,需要先⽤⼀个内部临时表来保存 SELECT 语句查询出来的⾏,然后将这些⾏插⼊到⽬标表中
    • 使⽤ COUNT(DISTINCT) 和 GROUP_CONCAT() 表达式时
    • 使⽤窗⼝函数时

✅ 解答问题

  • 由服务器⾃动创建的临时表是内部临时表,通常MySQL在执⾏查询与计算的过程中会⾃动⽣成的内部临时表

3.1 如何确认服务器创建了临时表?

  • 要确定SQL语句是否需要临时表,使⽤ EXPLAIN 并检查 Extra 列,在优化专题中我们再详细介绍

4 临时表都有哪些设置?

🔍 分析过程

  • 系统变量 internal_tmp_mem_storage_engine ⽤于指定内存中内部临时表的存储引擎,值为 TempTable (默认值)或 MEMORY ;
  • TempTable 存储引擎为 VARCHAR 和 VARBINARY 列以及其他⼆进制⼤对象类型进⾏了优化;
  • 从MySQL 8.0.28开始 tmp_table_size 定义了由 TempTable 存储引擎创建的单个内部临时表允许使⽤内存的最⼤值,当达到 tmp_table_size 限制时,MySQL⾃动将内存中的内部临时表转换为磁盘上的InnoDB内部临时表。 tmp_table_size 的默认值是 16MB ;
  • 系统变量 temptable_max_ram 定义 TempTable 存储引擎创建的所有临时表可以使⽤的最⼤内存,默认为 1GB ,超出限制后将内存中的内部临时表转换为磁盘上内部临时表;
  • 当内存临时表使⽤内存存储引擎 internal_tmp_mem_storage_engine=MEMORY 时,系统变量 max_heap_table_size 可以限制内存内部临时表的最⼤⾏数,默认 16777216
  • 内存存储引擎临时表变得太⼤,MySQL会⾃动将其转换为磁盘上的临时表,内存中临时表的⼤⼩由 tmp_table_size 和 max_heap_table_size 这两个系统变量中最⼩的值决定。

✅ 解答问题

  • 通过配置对应的系统变量来指定临时表使⽤的存储引擎、使⽤内存的⼤⼩、表中的最⼤⾏数等选项。

5 临时表中的数据存在哪⾥?

🔍 分析过程

  • 磁盘上的临时表数据存储在临时表空间中,MySQL8.0版本中磁盘上的临时表存储引擎⽀持InnoDB ,分为两种类型分别是:
    • 会话临时表空间( session temporary tablespaces )
    • 全局临时表空间( global temporary tablespace )。

5.1 会话临时表空间的作⽤?

  • 磁盘上的会话临时表空间存储由⽤⼾创建的外部临时表和优化器创建的内部临时表;

5.2 会话临时表空间的数据存在哪⾥?

  • 当MySQL接收到第⼀个创建磁盘临时表的请求时,从临时表空间池中分配会话临时表空间;⼀个会话最多分配两个表空间,⼀个⽤于⽤⼾创建的临时表,另⼀个⽤于优化器创建的内部临时表。会话的临时表空间⽤于存储会话创建的所有磁盘临时表,当会话断开连接时,临时表空间将被截断并释放回池中;
  • 服务器启动时会创建⼀个包含 10 个临时表空间的临时表空间池,表空间会根据需要⾃动添加到池中,临时表空间池在MySQL正常关闭或中⽌初始化时被删除;
  • 会话临时表空间⽂件扩展名为 .ibt ;
  • 系统变量 innodb_temp_tablespaces_dir 可以指定会话临时表空间的位置。默认数据⽬录下的 #innodb_temp ⽬录(开头的 # 号是为了避免与数据库⽬录命名冲突),如果⽆法创建临时表空间池,服务器则拒绝启动;

image-20241026224009480

5.3 全局临时表空间的作⽤?

  • 全局临时表空间存储对⽤⼾创建的临时表所做的更改,以便以后回滚操作

5.4 全局临时表空间的数据存在哪⾥?

  • 系统变量 innodb_temp_data_file_path 指定了全局临时表空间数据⽂件的相对路径、名称、⼤⼩和属性。如果没有指定,则默认在系统表空间⽬录(系统变量innodb_data_home_dir 指定的⽬录)中创建,默认名为 ibtmp1 ,初始⽂件⼤⼩略⼤于12MB ;

image-20241026224128485

  • 全局临时表空间在正常关闭或中⽌初始化时被删除,并在每次启动服务器时重新创建,如果⽆法创建全局临时表空间,则拒绝启动;如果服务器意外停⽌,重启服务器时会⾃动删除并重新创建全局临时表空间。

✅ 解答问题

  • 磁盘上的临时表数据存储在临时表空间中,临时表空间分为两种分别是:
    • 会话临时表空间( session temporary tablespaces ),默认数据⽬录下的#innodb_temp ⽬录中
    • 全局临时表空间( global temporary tablespace ),默认在数据⽬录下中创建,名为ibtmp1

6 怎么查看全局临时表空间的信息和⼤⼩?

  • 可以通过 INFORMATION_SCHEMA.FILES 查看全局临时表空间的元数据:

image-20241026224309731

  • 要检查全局临时表空间数据⽂件的⼤⼩,可以查询 INFORMATION_SCHEMA.FILES 中的具体字段

image-20241026224336521

  • 默认情况下,全局临时表空间数据⽂件会⾃动扩展并根据需要增加⼤⼩,要确定全局临时表空间数据⽂件是否⾃动扩展,可以检查 innodb_temp_data_file_path 变更设置:

image-20241026224423718

解答问题

可以通过 INFORMATION_SCHEMA.FILES 查看全局临时表空间的元数据

6.1 全局临时表空间数据⽂件的⼤⼩可以设置吗?

  • 可以通过系统变量 innodb_temp_data_file_path 指定最⼤⽂件⼤⼩,并重新启动服务器,语法与配置系统表空间⽂件相同
# mysqld节点
 [mysqld]
3 innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:500M

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 抛异常

目录 一.抛异常与运行崩溃的区别 1.运行崩溃 2.抛异常 二.抛异常机制存在的意义 1.清晰的处理错误 2.结构化的错误管理 3.跨函数传递错误信息 4.异常对象多态性 三.抛异常的使用方法 1.抛出异常 (throw) 2.捕获异常 (catch) 3.标准异常类 四.抛异常的处理机制 1.抛…

2024“源鲁杯“高校网络安全技能大赛-Misc-WP

Round 1 hide_png 题目给了一张图片,flag就在图片上,不过不太明显,写个python脚本处理一下 from PIL import Image ​ # 打开图像并转换为RGB模式 img Image.open("./attachments.png").convert("RGB") ​ # 获取图像…

rabbitmq 使用注意事项

1,注意开启的端口号,一共四个端口号,1883是mqtt连接的端口号,如果没开,是连接不上的需要手动起mqtt插件。 //开始mqtt插件服务 rabbitmq-plugins enable rabbitmq_mqtt 2,15672端口是http网页登录的管理后…

Next Stack技术联盟成立:打造新一代基础软件技术栈

北京,2024 年 10 月 —— 在全球数字化浪潮的推动下,中国基础软件产业迎来了前所未有的创新机遇与挑战。为应对这一时代任务并推动中国基础软件的全球化进程,观测云携手多家领先技术企业正式宣布成立 Next Stack 技术联盟。这一联盟旨在汇聚国…

接口测试(五)jmeter——get请求

一、get请求——短信验证码(示例仅供参考) 1. get请求:传参数据直接拼接在地址后面,jmeter不需要设置请求头content-type 注:短信验证码接口,返回结果中不会返回短信验证码,是存在数据库表中&a…

Maven项目管理工具-初始+环境配置

1. Maven的概念 1.1. 什么是Maven Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。 理想的项目构建:高度自动化,跨平台,可重用的组件,标准化的流程 maven能够自动下载依…

Mybatis-plus-入门

Mybatis-plus-入门 1&#xff1a;介绍 mybatis-plus的官网&#xff1a;MyBatis-Plus &#x1f680; 为简化开发而生 2: 快速入门 步骤&#xff1a; 1&#xff1a;引入依赖&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>my…

STM32使用硬件I2C读写AT24C02 EEPROM(一)

文章目录 一、软件准备配置I2C接口&#xff1a;生成工程代码&#xff1a; 二、编写驱动程序初始化I2C接口&#xff1a;编写读写函数&#xff1a; 三、调试与测试 前面讲到使用软件模拟i2c读写AT24C02&#xff0c;这篇文章使用stm32 提供的硬件i2c读写&#xff0c;看看怎么回事 …

gin入门教程(3):创建第一个 HTTP 服务器

首先设置golang github代理&#xff0c;可解决拉取git包的时候&#xff0c;无法拉取的问题&#xff1a; export GOPROXYhttps://goproxy.io再查看自己的go版本&#xff1a; go version我这里的版本是&#xff1a;go1.23.2 linux/arm64 准备工作做好之后就可以进行开发了 3.…

【AscendC算子开发】笔记1 算子开发哲学

重看这门课&#xff0c;有很多内容的认识更深了&#xff0c;做一些记录。 为什么不能将网络节点融合 这个问题关联到另一个问题&#xff1a;为什么我们需要激活函数&#xff1f; 使用线性的神经元堆叠得到的方程最后也是线性方程&#xff0c;无法表征非线性的信息&#xff0c…

软考(网工)——网络安全

文章目录 &#x1f550;网络安全基础1️⃣网络安全威胁类型2️⃣网络攻击类型 &#x1f551;现代加密技术1️⃣私钥密码/对称密码体制2️⃣对称加密算法总结3️⃣公钥密码/非对称密码4️⃣混合密码5️⃣国产加密算法 - SM 系列6️⃣认证7️⃣基于公钥的认证 &#x1f552;Hash …

Node.js:深入探秘 CommonJS 模块化的奥秘

在Node.js出现之前&#xff0c;服务端JavaScript基本上处于一片荒芜的境况&#xff0c;而当时也没有出现ES6的模块化规范。因此&#xff0c;Node.js采用了当时比较先进的一种模块化规范来实现服务端JavaScript的模块化机制&#xff0c;它就是CommonJS&#xff0c;有时也简称为C…

react18中使用redux管理公共数据仓库实现数据immutable更新

Immutable.js出自Facebook&#xff0c;是最流行的不可变数据结构的实现之一。它实现了完全的持久化数据结构&#xff0c;使用结构共享。所有的更新操作都会返回新的值&#xff0c;但是在内部结构是共享的&#xff0c;来减少内存占用。Immutablejs官网 在上一篇介绍redux的文章&…

数字IC后端实现 | Innovus各个阶段常用命令汇总

应各位读者要求&#xff0c;小编最近按照Innovus流程顺序整理出数字IC后端项目中常用的命令汇总。限于篇幅&#xff0c;这次只更新到powerplan阶段。有了这份Innovus常用命令汇总&#xff0c;学习数字IC后端从此不再迷路&#xff01;如果大家觉得这个专题还不错&#xff0c;想继…

实验:使用Oxygen发布大型手册到Word格式

此前&#xff0c;我曾发表过一篇文章《结构化文档发布的故事和性能调优》&#xff0c;文中讨论了在将大型DITA手册转换为PDF格式时可能遇到的性能挑战及相应的优化策略。 近日&#xff0c;有朋友咨询&#xff0c;若将同样的大型手册输出为MS Word格式&#xff0c;是否也会面临…

MongoDB Shell 基本命令(三)生成学生脚本信息和简单查询

一、生成学生信息脚本 利用该脚本可以生成任意个学生信息&#xff0c;包括学号、姓名、班级、年级、专业、课程名称、课程成绩等信息&#xff0c;此处生成2万名学生&#xff0c;学生所有信息都是给定范围后随机生成。 生成学生信息后&#xff0c;再来对学生信息进行简单查询。…

Java 开发——(上篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus

一、概述 记录时间 [2024-10-23] 本文是一个基于 Spring Boot 3 MybatisPlus 的项目实战开发&#xff0c;主要涵盖以下几个方面&#xff1a; 从零开始的项目创建IDEA 中开发环境的热部署Maven、Swagger3、MybatisPlus 等的配置路由映射知识静态资源访问文件上传功能实现拦截器…

探寻闲鱼libsgmain加解密算法(4) ——JNI入口跳转

关注我的人都知道我一直在学习阿里的加密和算法&#xff0c;除了研究逆向问题&#xff0c;还会把学来的阿里技术用在自己的应用上。 为什么&#xff1f;因为学习大厂的应用&#xff0c;是进步最快的方法。而大厂在安全和加密方面的技术&#xff0c;个人觉得阿里做的是最好的。 …

个体能量的勇气层级是否容易达到?

没有勇气面对现实&#xff0c;没有勇气改变自我&#xff0c;没有勇气改变环境&#xff0c;没有勇气创新创造。 这是常态。 如何找寻高质量免费机器人工程资源自学提升-CSDN博客 个人能力的提升&#xff0c;也包括个体能量的提升。 个体能量是个人能力的一个非常重要的衡量指…

Spring Boot整合Stripe订阅支付指南

在当今的在线支付市场中&#xff0c;Stripe 作为一款一体化的全球支付平台&#xff0c;因其易用性和广泛的支付方式支持&#xff0c;得到了许多企业的青睐。本文将详细介绍如何在 Spring Boot 项目中整合 Stripe 实现订阅支付功能。 1.Stripe简介 Stripe 是一家为个人或公司提…