10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国高级主任)- 36.3 mb
PDF (A4)- 36.3 mb
手册页(TGZ)- 236.9 kb
手册页(Zip)- 348.5 kb
信息(Gzip)- 3.4 mb
信息(邮政编码)- 3.4 mb
本手册节选

8.4.4 MySQL内部临时表使用

在某些情况下,服务器在处理语句时创建内部临时表。用户无法直接控制何时发生这种情况。

服务器在如下条件下创建临时表:

若要确定语句是否需要临时表,请使用解释检查额外的列查看是否显示使用临时(见第8.8.1节,“使用EXPLAIN优化查询”).解释并不是说使用临时用于派生的或物化的临时表。

有些查询条件会阻止使用内存中的临时表,在这种情况下,服务器会使用磁盘中的临时表:

  • 存在文本列。这包括具有字符串值的用户定义变量,因为它们被视为文本列,具体取决于它们的值是二进制字符串还是非二进制字符串。

  • 类中存在最大长度大于512(二进制字符串为字节,非二进制字符串为字符)的任何字符串列选择列表中,如果联盟UNION ALL使用。

  • 显示列而且描述语句使用作为某些列的类型,因此用于结果的临时表是磁盘上的表。

服务器不使用临时表联盟满足一定条件的陈述。相反,它只从临时表创建中保留执行结果列类型转换所需的数据结构。表没有完全实例化,也没有向表写入或从表中读取任何行;行被直接发送到客户端。结果是减少了内存和磁盘需求,并且减少了第一行发送到客户端之前的延迟,因为服务器不需要等到最后一个查询块执行。解释和优化器跟踪输出反映了此执行策略联盟的结果不存在查询块,因为该块对应于从临时表中读取数据的部分。

这些条件符合联盟对于没有临时表的计算:

  • 工会是UNION ALL,而不是联盟结合不同的

  • 没有全球性命令条款。

  • 对象的顶级查询块{insert | replace}…选择……声明。

内部临时表存储引擎

内部临时表可以保存在内存中,并由内存存储引擎,或存储在磁盘上的InnoDBMyISAM存储引擎。

如果内部临时表创建为内存中的表,但变得太大,MySQL会自动将其转换为磁盘上的表。内存中临时表的最大大小由tmp_table_sizemax_heap_table_size值,取较小的值。这与内存显式地使用创建表.对于这样的表,只有max_heap_table_size变量决定表可以增长的大小,并且没有转换到磁盘上的格式。

internal_tmp_disk_storage_engine变量定义服务器用于管理磁盘上的内部临时表的存储引擎。允许的值为INNODB(默认值)和MYISAM

请注意

当使用internal_tmp_disk_storage_engine = INNODB,查询在磁盘上生成的内部临时表超过InnoDB行或列限制返回行大小太大列太多错误。解决方法是设置internal_tmp_disk_storage_engineMYISAM

在内存或磁盘上创建内部临时表时,服务器会增加Created_tmp_tables价值。在磁盘上创建内部临时表时,服务器会增加Created_tmp_disk_tables价值。如果在磁盘上创建了太多内部临时表,请考虑增加tmp_table_size而且max_heap_table_size设置。

内部临时表存储格式

内存中临时表由内存存储引擎,使用定长行格式。VARCHAR而且VARBINARY列值被填充到最大列长度,实际上将它们存储为字符而且二进制列。

磁盘上的临时表由InnoDBMyISAM存储引擎(取决于internal_tmp_disk_storage_engine设置)。两个引擎都使用动态宽度行格式存储临时表。列只占用所需的存储空间,与使用固定长度行的磁盘表相比,这减少了磁盘I/O、空间需求和处理时间。

对于最初在内存中创建内部临时表,然后将其转换为磁盘上的表的语句,跳过转换步骤并开始在磁盘上创建表可能会获得更好的性能。的big_tables变量可用于强制磁盘存储内部临时表。