正文
mysql怎么存临时表 mysql如何使用临时表
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
MYSQL存储引擎InnoDB(三十五):临时表空间
InnoDB使用会话临时表空间和全局临时表空间。
在InnoDB配置为磁盘内部临时表mysql怎么存临时表的存储引擎时mysql怎么存临时表,会话临时表空间存储用户创建的临时表和优化器创建的内部临时表。从 MySQL 8.0.16 开始mysql怎么存临时表,用于磁盘内部临时表的存储引擎固定为InnoDB。(之前,存储引擎由internal_tmp_disk_storage_engine的值决定 )
在第一次请求创建磁盘临时表时会话临时表空间从临时表空间池中被分配给会话。一个会话最多分配两个表空间,一个用于用户创建的临时表,另一个用于优化器创建的内部临时表。分配给会话的临时表空间用于会话创建的所有磁盘临时表。当会话断开连接时,其临时表空间将被截断并释放回池中。服务器启动时会创建一个包含 10 个临时表空间的池。池的大小永远不会缩小,并且表空间会根据需要自动添加到池中。临时表空间池在正常关闭或中止初始化时被删除。会话临时表空间文件在创建时大小为 5 页,并且具有.ibt文件扩展名。
InnoDB为会话临时表空间保留mysql怎么存临时表了40 万个空间 ID。因为每次启动服务器时都会重新创建会话临时表空间池,所以会话临时表空间的空间 ID 在服务器关闭时不会保留,并且可以重复使用。
innodb_temp_tablespaces_dir 变量定义了创建会话临时表空间的位置。默认位置是 #innodb_temp数据目录中的目录。如果无法创建临时表空间池,则会拒绝启动。
在基于语句的复制 (SBR) 模式下,在副本上创建的临时表驻留在单个会话临时表空间中,该临时表空间仅在 MySQL 服务器关闭时被截断。
INNODB_SESSION_TEMP_TABLESPACES 表提供有关会话临时表空间的元数据。
该INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO表提供有关在InnoDB实例中处于活动状态的用户创建的临时表的元数据。
全局临时表空间 ( ibtmp1) 存储对用户创建的临时表所做的更改的回滚段。
innodb_temp_data_file_path 变量定义了全局临时表空间数据文件的相对路径、名称、大小和属性。如果没有为innodb_temp_data_file_path指定值 ,则默认行为是创建innodb_data_home_dir目录中命名为ibtmp1的单个自动扩展数据文件。初始文件大小略大于 12MB。
全局临时表空间在正常关闭或中止初始化时被删除,并在每次服务器启动时重新创建。全局临时表空间在创建时会收到一个动态生成的空间 ID。如果无法创建全局临时表空间,则拒绝启动。如果服务器意外停止,则不会删除全局临时表空间。在这种情况下,数据库管理员可以手动删除全局临时表空间或重新启动 MySQL 服务器。重新启动 MySQL 服务器会自动删除并重新创建全局临时表空间。
全局临时表空间不能驻留在原始设备上。
INFORMATION_SCHEMA.FILES提供有关全局临时表空间的元数据。发出与此类似的查询以查看全局临时表空间元数据:
默认情况下,全局临时表空间数据文件会自动扩展并根据需要增加大小。
要确定全局临时表空间数据文件是否正在自动扩展,请检查以下 innodb_temp_data_file_path 设置:
要检查全局临时表空间数据文件的大小,请使用与此类似的查询来查询INFORMATION_SCHEMA.FILES表:
TotalSizeBytes显示全局临时表空间数据文件的当前大小。
或者,检查操作系统上的全局临时表空间数据文件大小。全局临时表空间数据文件位于 innodb_temp_data_file_path 变量定义的目录中。
要回收全局临时表空间数据文件占用的磁盘空间,请重新启动 MySQL 服务器。重新启动服务器会根据innodb_temp_data_file_path定义的属性删除并重新创建全局临时表空间数据文件 。
要限制全局临时表空间数据文件的大小,请配置 innodb_temp_data_file_path以指定最大文件大小。例如:
配置 innodb_temp_data_file_path 需要重新启动服务器。
在mysql里怎么用临时表
MySQL 需要创建隐式临时表来解决某些类型的查询。往往查询的排序阶段需要依赖临时表。例如,当您使用 GROUP BY,ORDER BY 或DISTINCT 时。这样的查询分两个阶段执行:首先是收集数据并将它们放入临时表中,然后是在临时表上执行排序。
对于某些 UNION 语句,不能合并的 VIEW,子查询时用到派生表,多表 UPDATE 以及其他一些情况,还需要使用临时表。如果临时表很小,可以到内存中创建,否则它将在磁盘上创建。MySQL 在内存中创建了一个表,如果它变得太大,就会被转换为磁盘上存储。内存临时表的最大值由 tmp_table_size 或 max_heap_table_size 值定义,以较小者为准。MySQL 5.7 中的默认大小为 16MB。如果运行查询的数据量较大,或者尚未查询优化,则可以增加该值。设置阈值时,请考虑可用的 RAM 大小以及峰值期间的并发连接数。你无法无限期地增加变量,因为在某些时候你需要让 MySQL 使用磁盘上的临时表。
注意:如果涉及的表具有 TEXT 或 BLOB 列,则即使大小小于配置的阈值,也会在磁盘上创建临时表。
技术分享 | 浅谈 MySQL 的临时表和临时文件
本文内容来源于对客户的三个问题的思考:
以下测试都是在 MySQL 8.0.21 版本中完成,不同版本可能存在差异,可自行测试;
临时表和临时文件都是用于临时存放数据集的地方;
一般情况下,需要临时存放在临时表或临时文件中的数据集应该符合以下特点:
从临时表|临时文件产生的主观性来看,分为2类:
用户创建临时表:
-- 用户创建临时表(只有创建临时表的会话才能查看其创建的临时表的内容)
注意:
可以创建和普通表同名临时表,其他会话可以看到普通表(因为看不到其他会话创建的临时表);
创建临时表的会话会优先看到临时表;
-- 同名表的创建的语句如下
当存在同名的临时表时,会话都是优先处理临时表(而不是普通表),包括:select、update、delete、drop、alter 等操作;
查看用户创建的临时表:
任何 session 都可以执行下面的语句;
查看用户创建的当前 active 的临时表(不提供 optimizer 使用的内部 InnoDB 临时表信息)
注意
用户创建的临时表,表名为t1,
但是通过 INNODB_TEMP_TABLE_INFO 查看到的临时表的 NAME 是#sql开头的名字,例如:#sql45aa_7c69_2 ;
另外 information_schema.tables 表中是不会记录临时表的信息的。
用户创建的临时表的回收:
用户创建的临时表的其他信息参数:
会话临时表空间存储 用户创建的临时表和优化器 optimizer 创建的内部临时表(当磁盘内部临时表的存储引擎为 InnoDB 时);
innodb_temp_tablespaces_dir 变量定义了创建 会话临时表空间的位置,默认是数据目录下的#innodb_temp 目录;
文件类似temp_[1-20].ibt ;
查看会话临时表空间的元数据:
用户创建的临时表删除后,其占用的空间会被释放(temp_[1-20].ibt文件会变小)。
在 MySQL 8.0.16 之前,internal_tmp_disk_storage_engine 变量定义了用户创建的临时表和 optimizer 创建的内部临时表的引擎,可选 INNODB 和 MYISAM ;
从 MySQL 8.0.16 开始,internal_tmp_disk_storage_engine参数被移除,默认使用InnoDB存储引擎;
innodb_temp_data_file_path 定义了用户创建的临时表使用的回滚段的存储文件的相对路径、名字、大小和属性,该文件是全局临时表空间(ibtmp1);
可以使用语句查询全局临时表空间的数据文件大小:
SQL 什么时候产生临时表|临时文件呢?
需要用到临时表或临时文件的时候,optimizer 自然会创建使用(感觉是废话,但是又觉得有道理=.=!);
(想象能力强的,可以牢记上面这句话;想象能力弱的,只能死记下面的 SQL 了。我也弱,此处有个疲惫的微笑😊)
下面列举一些 server 在处理 SQL 时,可能会创建内部临时表的 SQL :
SQL 包含 union | union distinct 关键字
SQL 中存在派生表
SQL 中包含 with 关键字
SQL 中的order by 和 group by 的字段不同
SQL 为多表 update
SQL 中包含 distinct 和 order by 两个关键字
我们可以通过下面两种方式判断 SQL 语句是否使用了临时表空间:
# 如果 explain 的 Extra 列包含 Using temporary ,那么说明会使用临时空间,如果包含 Using filesort ,那么说明会使用文件排序(临时文件);
如果执行 SQL 后,表的 ID 列变为了show processlist 中的 id 列的值,那么说明 SQL 语句使用了临时表空间
SQL创建的内部临时表的存储信息:
SQL 创建内部临时表时,优先选择在内存中,默认使用 TempTable 存储引擎(由参数 internal_tmp_mem_storage_engine 确定),
当 temptable 使用的内存量超过 temptable_max_ram 定义的大小时,
由 temptable_use_mmap 确定是使用内存映射文件的方式还是 InnoDB 磁盘内部临时表的方式存储数据
(temptable_use_mmap 参数在 MySQL 8.0.16 引入,MySQL 8.0.26 版本不推荐,后续应该会移除);
temptable_use_mmap 的功能将由MySQL 8.0.23 版本引入的 temptable_max_mmap 代替,
当 temptable_max_mmap=0 时,说明不使用内存映射文件,等价于 temptable_use_mmap=OFF ;
当 temptable_max_mmap=N 时,N为正整数,包含了 temptable_use_mmap=ON 以及声明了允许为内存映射文件分配的最大内存量。
该参数的定义解决了这些文件使用过多空间的风险。
内存映射文件产生的临时文件会存放于 tmpdir 定义的目录中,在 TempTable 存储引擎关闭或 mysqld 进程关闭时,回收空间;
当 SQL 创建的内部临时表,选择 MEMORY 存储引擎时,如果内存中的临时表变的太大,MySQL 将自动将其转为磁盘临时表;
其能使用的内存上限为 min(tmp_table_size,max_heap_table_size);
监控 TempTable 从内存和磁盘上分配的空间:
具体的字段含义见:Section 27.12.20.10, “Memory Summary Tables”.
监控内部临时表的创建:
当在内存或磁盘上创建内部临时表,服务器会增加 Created_tmp_tables 的值;
当在磁盘上创建内部临时表时,服务器会增加 Created_tmp_disk_tables 的值,
如果在磁盘上创建了太多的内部临时表,请考虑增加 tmp_table_size 和 max_heap_table_size 的值;
created_tmp_disk_tables 不计算在内存映射文件中创建的磁盘临时表;
例外项:
临时表/临时文件一般较小,但是也存在需要大量空间的临时表/临时文件的需求:
因为这些例外项一般需要较大的空间,所以需要考虑是否要将其存放在独立的挂载点上。
其他:
列出由失败的 alter table 创建的隐藏临时表,这些临时表以#sql开头,可以使用 drop table 删除;
通过 lsof +L1 可以查看标识为 delete ,但还未释放空间的文件。
如果想释放这些 delete 状态的文件,可以尝试下面的方法(不推荐,后果自负):
普通的磁盘临时表|临时文件(一般需要较小的空间):
临时表|临时文件的一般所需的空间较小,会优先存放于内存中,若超过一定的大小,则会转换为磁盘临时表|临时文件;
磁盘临时表默认为 InnoDB 引擎,其存放在临时表空间中,由 innodb_temp_tablespaces_dir 定义表空间的存放目录,表空间文件类似:temp_[1-20].ibt ;MySQL 未定义 InnoDB 临时表空间的最大使用上限;
当临时表|临时文件使用完毕后,会自动回收临时表空间文件的大小;
innodb_temp_data_file_path 定义了用户创建的临时表使用的回滚段的存储文件的相对路径、名字、大小和属性,该文件是全局临时表空间(ibtmp1),该文件可以设置文件最大使用大小;
例外项(一般需要较大的空间):
load data local 语句,客户端读取文件并将其内容发送到服务器,服务器将其存储在 tmpdir 参数指定的路径中;
在 replica 中,回放 load data 语句时,需要将从 relay log 中解析出来的数据存储在 slave_load_tmpdir(replica_load_tmpdir) 指定的目录中,该参数默认和 tmpdir 参数指定的路径相同;
需要 rebuild table 的在线 alter table 需要使用 innodb_tmpdir 存放排序磁盘排序文件,如果 innodb_tmpdir 未指定,则使用 tmpdir 的值;
若用户判断产生的临时表|临时文件一定会转换为磁盘临时表|临时文件,那么可以设置 set session big_tables=1;让产生的临时表|临时文件直接存放在磁盘上;
对于需要较小空间的临时表|临时文件,MySQL 要么将其存储于内存,要么放在统一的磁盘临时表空间中,用完即释放;
对于需要较大空间的临时表|临时文件,可以通过设置参数,将其存储于单独的目录|挂载点;例如:load local data 语句或需要重建表的在线 alter table 语句,都有对应的参数设置其存放临时表|临时文件的路径;
当前只有 innodb_temp_data_file_path 参数可以限制 用户创建的临时表使用的回滚段的存储文件的大小,无其他参数可以限制临时表|临时文件可使用的磁盘空间;
【MySQL】MySQL的tmpdir临时文件说明及使用设置
MySQL临时目录用于存储临时文件或临时表,值可以是一个使用“:”(Unix)或“;”(Windows)分隔的路径列表,这些路径可被轮流使用,以便将负载分到不同磁盘。
若MySQL server是作为Slave的角色,则不能将该目录指向基于内存文件系统的目录或者当主机重启时会被清理掉的目录,因为Slave需要这些文件复制临时表或执行LOAD DATA INFILE操作,这些文件丢失会导致复制失败。这意味着不能将slave的tmpdir设置为linux系统默认的/tmp目录。
对于Slave可以使用另一配置项slave_load_tmpdir来设置其临时目录,这样Slave可以不使用通用选项tmpdir设置的临时目录,对于非Slave角色的MySQL server没此限制。
若临时目录不存在或权限不正确不仅会引起MySQL Server启动失败还会导致其他可能使用到临时目录的MySQL实用程序运行异常。很多MySQL相关程序会从MySQL Server的配置文件读取选项值。
MySQL 日志配置
MySQL的tmpdir临时文件说明及使用设置
一个MysQL /tmp目录爆满问题的处理
Shall I change the mysql tmpdir from /tmp to /var/lib/mysql/tmp ?
MySQL 临时目录
How to know if mysql tmpdir is being used?
MySQL, RAM disk for tmpdir
Changing the tmp folder of MySQL
MySQL中的临时表使用方法讲解
当工作在非常大的表上时 你可能偶尔需要运行很多查询获得一个大量数据的小的子集 不是对整个表运行这些查询 而是让MySQL每次找出所需的少数记录 将记录选择到一个临时表可能更快些 然后多这些表运行查询 创建临时表很容易 给正常的CREATE TABLE语句加上TEMPORARY关键字 CREATE TEMPORARY TABLE tmp_table (name VARCHAR( ) NOT NULL value INTEGER NOT NULL)临时表将在你连接MySQL期间存在 当你断开时 MySQL将自动删除表并释放所用的空间 当然你可以在仍然连接的时候删除表并释放空间 DROP TABLE tmp_table如果在你创建名为tmp_table临时表时名为tmp_table的表在数据库中已经存在 临时表将有必要屏蔽(隐藏)非临时表tmp_table 如果你声明临时表是一个HEAP表 MySQL也允许你指定在内存中创建它 CREATE TEMPORARY TABLE tmp_table (name VARCHAR( ) NOT NULL value INTEGER NOT NULL) TYPE = HEAP因为HEAP表存储在内存中 你对它运行的查询可能比磁盘上的临时表快些 然而 HEAP表与一般的表有些不同 且有自身的限制 详见MySQL参考手册 正如前面的建议 你应该测试临时表看看它们是否真的比对大量数据库运行查询快 如果数据很好地索引 临时表可能一点不快 lishixinzhi/Article/program/MySQL/201311/29492
MySQL如何使用临时表
解决办法:
当临时表不存在时,将查询结果保存在临时表中:
CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name;
我的具体代码是
CREATE temporary table tmp
(SELECT t1.pid a, t1.pname b,t2.pid c, t2.pdescribe d FROM
(SELECT pid,pname FROM admin_advert_place WHERE pid IN (3,4,5,6,7)) t1 LEFT JOIN
(SELECT pid,pdescribe FROM admin_advert_place
WHERE pgid IN (6,7,8)) t2 ON t1.pid = t2.pid)
mysql怎么存临时表的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mysql如何使用临时表、mysql怎么存临时表的信息别忘了在本站进行查找喔。