mysql创建临时表(mysql创建临时表语句)

本篇文章给大家谈谈mysql创建临时表,以及mysql创建临时表语句对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

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 列,则即使大小小于配置的阈值,也会在磁盘上创建临时表。

[img]

技术分享 | 浅谈 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存储引擎InnoDB(三十五):临时表空间

InnoDB使用会话临时表空间和全局临时表空间。

在InnoDB配置为磁盘内部临时表的存储引擎时,会话临时表空间存储用户创建的临时表和优化器创建的内部临时表。从 MySQL 8.0.16 开始,用于磁盘内部临时表的存储引擎固定为InnoDB。(之前,存储引擎由internal_tmp_disk_storage_engine的值决定 )

在第一次请求创建磁盘临时表时会话临时表空间从临时表空间池中被分配给会话。一个会话最多分配两个表空间,一个用于用户创建的临时表,另一个用于优化器创建的内部临时表。分配给会话的临时表空间用于会话创建的所有磁盘临时表。当会话断开连接时,其临时表空间将被截断并释放回池中。服务器启动时会创建一个包含 10 个临时表空间的池。池的大搏链小永远不会缩小,并且表空间会根据需要搭键自动添加到池中。临时表空间池在正常关闭或中止初始化时被删除。会话临时表空间文件在创建时大小为 5 页,并且具有.ibt文件扩展名。

InnoDB为会话临时表空间保留了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创建临时表?

1.查看create table 语毕旦句手腊扰里面的表、列、索引都要反斜杠符号也可以不使用,但不能写成 '单引号。不然执行就局薯会报1064错误了

2.不要使用mysql的保留字

关于mysql创建临时表和mysql创建临时表语句的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

Powered By Z-BlogPHP 1.7.2

备案号:蜀ICP备2023005218号