在某些情况下,服务器在处理语句时创建内部临时表。当发生这种情况时,用户无法直接控制。
服务器在诸如此类的条件下创建临时表:
评估
联盟
陈述,稍后描述的一些例外。评估一些观点,这样的观点
诱惑
算法,联盟
,或聚合。评估派生表(见第13.2.11.8节“派生表”)。
评估常见表表达(见第13.2.15节,“与(常见的表达式)”)。
为子查询或半素级化创建的表(见第8.2.2节,“优化子查询,派生表,查看引用和常见表表达式”)。
评估包含一个的陈述
订购
条款和不同的通过...分组
条款,或者订购
或者通过...分组
包含来自加入队列中第一个表的表中的列。评估
清楚的
结合订购
可能需要临时表。对于使用的查询
sql_small_result.
修改器,MySQL使用内存中的临时表,除非查询还包含需要在磁盘存储上的元素(稍后描述)。评估
插入...选择
从中选择和插入到同一表中的语句,MySQL创建一个内部临时表以从中保存行选择
,然后将这些行插入目标表中。看第13.2.6.1节“插入... SELECT语句”。多表的评估
更新
陈述。评估
group_concat()
或者计数(截然不同)
表达。评估窗口功能(见第12.21节“窗口函数”)使用必要时使用临时表。
确定语句是否需要临时表,使用解释
并检查一下额外的
列看它是否说使用临时
(看第8.8.1节“通过解释优化查询”)。解释
不一定说使用临时
用于派生或物化的临时表。对于使用窗口函数的语句,解释
和格式= json.
始终提供有关窗口步骤的信息。如果窗口函数使用临时表,则为每个步骤指示。
一些查询条件阻止使用内存中的临时表,在这种情况下,服务器使用磁盘表:
服务器不使用临时表联盟
符合某些资格的陈述。相反,它只能从临时表创建中保留执行结果列类型所需的数据结构。该表未完全实例化,没有从中写入或读取行;行直接发送给客户端。结果减少了内存和磁盘要求,并且在第一行发送到客户端之前的延迟较小,因为服务器不需要等到最后一次查询块。解释
和优化器跟踪输出反映了此执行策略:联盟结果
不存在查询块,因为该块对应于从临时表读取的部分。
这些条件有资格获得联盟
对于没有临时表的评估:
联盟是
联盟全部
, 不是联盟
或者联盟截然不同
。没有全球
订购
条款。Union不是顶级查询块
{插入|替换} ...选择...
陈述。
内部临时表可以保存在内存中并由其处理诱惑
或者记忆
存储引擎,或存储在磁盘上Innodb.
存储引擎。
用于内存内部临时表的存储引擎
这Internal_tmp_mem_storage_engine.
会话变量定义内存内部临时表的存储引擎。允许的值是诱惑
(默认)和记忆
。
这诱惑
存储引擎提供有效存储varchar.
和varbinary.
列和MySQL 8.0.13的列和其他二进制大对象类型。
这temptable_max_ram.
变量定义可由占用的最大RAM量诱惑
存储引擎在它开始在表单内存映射的临时文件中从磁盘分配空间或Innodb.
磁盘内部临时表。默认值temptable_max_ram.
设置是1gib。这temptable_use_mmap.
变量(在MySQL 8.0.16中介绍;在MySQL 8.0.26中弃用)控制是否诱惑
存储引擎使用内存映射的文件或Innodb.
磁盘内部临时表temptable_max_ram.
超出限制。默认设置是temptable_use_mmap = on.
。这temptable_max_mmap.
在MySQL 8.0.23中引入的变量定义了最大内存量允许在将内部临时表数据存储到存储内部临时表数据之前从内存映射的文件中分配到内存映射引擎Innodb.
磁盘内部临时表。一种temptable_max_mmap = 0.
设置禁用内存映射文件的分配,有效地禁用其使用,无论temptable_use_mmap.
环境。
这temptable_use_mmap.
变量被推荐为MySQL 8.0.26;期望在未来版本的MySQL中删除它。环境temptable_max_mmap = 0.
相当于设置temptable_use_mmap = off.
。
这temptable_max_ram.
设置不考虑分配给使用使用该线程的线程本地内存块诱惑
存储引擎。线程本地存储块的大小取决于线程的第一内存分配请求的大小。如果请求小于1MB,它在大多数情况下,线程本地存储器块大小为1MB。如果请求大于1MB,则线程 - 本地存储器块与初始内存请求大致相同。线程本地存储块保持在线程本地存储中,直到线程出口。
使用内存映射的临时文件诱惑
存储引擎作为内部临时表的溢出机制由这些规则管理:
临时文件是在定义的目录中创建的
TMPDIR.
多变的。在创建和打开后立即删除临时文件,因此不再可见
TMPDIR.
目录。临时文件占用的空间由操作系统保持,而临时文件打开。当临时文件关闭时,会回收空间诱惑
存储引擎,或者何时mysqld.
流程关闭。数据永远不会在RAM和临时文件之间移动,RAM内或临时文件之间。
如果空格在限制范围内可用,则新数据存储在RAM中
temptable_max_ram.
。否则,新数据存储在临时文件中。如果在将表的某些数据写入临时文件后,如果将空格变为RAM,则剩余表数据可以存储在RAM中。
如果是诱惑
存储引擎配置为使用Innodb.
磁盘内部临时表作为溢出机制(temptable_use_mmap = off.
或者temptable_max_mmap.
= 0),一个超出的内存表temptable_max_ram.
限制转换为Innodb.
磁盘内部临时表,以及属于该表的任何行都从内存移动到Innodb.
磁盘内部临时表。这Internal_tmp_disk_storage_engine.
设置(在MySQL 8.0.16中删除)对此没有影响诱惑
存储引擎溢出机制。
在MySQL 8.0.23之前,Innodb.
建议磁盘内部临时表诱惑
溢出机制如果诱色的存储引擎通常超过temptable_max_ram.
限制并在临时目录中使用过多的空间用于内存映射的文件。截至MySQL 8.0.23,temptable_max_mmap.
变量定义了诱转存储引擎从内存映射文件分配的内存量的限制,这解决了使用太多空间的这些文件的风险。超过这一点temptable_max_ram.
由于使用大型内部临时表或广泛使用内部临时表而导致限制通常发生。Innodb.
磁盘内部临时表在会话临时表空间中创建,默认情况下驻留在数据目录中。有关更多信息,请参阅第15.6.3.5节“临时表空间”。
使用时记忆
存储引擎用于内存临时表,如果变得太大,MySQL会自动将内存中的临时表转换为磁盘表。内存中临时表的最大大小由此定义tmp_table_size.
或者max_heap_table_size.
价值,以较小的方式。这与之不同记忆
明确创建的表创建表
。对于这样的表,只有max_heap_table_size.
变量决定表格可以增长的大量,并且没有转换到磁盘格式。
用于磁盘内部临时表的存储引擎
从MySQL 8.0.16开始,服务器始终使用Innodb.
用于管理磁盘内部临时表的存储引擎。
在MySQL 8.0.15及更早版本中,Internal_tmp_disk_storage_engine.
变量用于定义用于磁盘内部临时表的存储引擎。此变量在MySQL 8.0.16中删除,为此目的使用的存储引擎不再是用户可配置的。
在MySQL 8.0.15及更早版本中:对于常见的表达式(CTES),用于磁盘内部临时表的存储引擎不能myisam.
。如果Internal_tmp_disk_storage_engine = myisam.
,出现错误的任何尝试使用磁盘临时表格化CTE的尝试。
在MySQL 8.0.15及更早版本中:使用时Internal_tmp_disk_storage_engine = InnoDB.
,生成超过的磁盘内部临时表的查询Innodb.
行或列限制返回行尺寸太大或者太多的专栏错误。解决方法是设置Internal_tmp_disk_storage_engine.
至myisam.
。
当内存内部临时表由内存管理时诱惑
存储引擎,包括的行varchar.
列,varbinary.
列和其他二进制大型对象类型列(由MySQL 8.0.13的支持)由一个单元格数组表示在内存中,每个单元包含空标志,数据长度和数据指针。列值在阵列之后以连续顺序放置,在单个内存区域中,无需填充。阵列中的每个单元格使用16个字节的存储。相同的存储格式适用于此时诱惑
存储引擎超过temptable_max_ram.
限制并开始将空间从磁盘分配为内存映射的文件或Innodb.
磁盘内部临时表。
当内存内部临时表由内存管理时记忆
存储引擎,使用固定长度行格式。varchar.
和varbinary.
列值填充到最大列长度,实际上将它们存储为char
和二进制
列。
在MySQL 8.0.16之前,由磁盘内部临时表管理Innodb.
或者myisam.
存储引擎(取决于Internal_tmp_disk_storage_engine.
环境)。两个引擎使用动态宽度行格式存储内部临时表。与使用固定长度行的磁盘表相比,列只需要根据需要的存储,这会减少磁盘I / O,空间要求和处理时间。从MySQL 8.0.16开始,Internal_tmp_disk_storage_engine.
不受支持,磁盘上的内部临时表始终处理Innodb.
。
使用时记忆
存储引擎,语句最初可以创建内存内部临时表,然后如果表变得太大,则将其转换为磁盘表。在这种情况下,可以通过跳过转换并在磁盘上创建内部临时表以开始来实现更好的性能。这big_tables.
变量可用于强制内部临时表的磁盘存储。
在内存或磁盘上创建内部临时表时,服务器会增加created_tmp_tables.
价值。在磁盘上创建内部临时表时,服务器会递增created_tmp_disk_tables.
价值。如果在磁盘上创建了太多内部临时表,请考虑增加tmp_table_size.
和max_heap_table_size.
设置。
由于已知的限制,created_tmp_disk_tables.
不计算在内存映射文件中创建的磁盘临时表。默认情况下,诱导的存储引擎溢出机制在内存映射的文件中创建内部临时表。这种行为由此控制temptable_use_mmap.
和temptable_max_mmap.
变量。
这内存/诱惑/物理_RAM
和内存/诱惑/物理_disk
性能架构仪器可用于监控诱惑
来自内存和磁盘的空间分配。内存/诱惑/物理_RAM
报告已分配的RAM的金额。内存/诱惑/物理_disk
报告在内存映射的文件用作诱转溢出机制时从磁盘分配的空间量。如果是photical_disk.
仪器报告0以外的值,而内存映射的文件用作诱导的溢出机制,temptable_max_ram.
在某些时候达到阈值。可以在性能架构内存摘要表中查询数据,例如memory_summary_global_by_event_name.
。看第27.12.20.10节“记忆汇总表”。