
MySQL 需要创建隐式临时表来解决某些类型的查询。大多数情况下,需要排序阶段的查询都需要依赖临时表。例如,当您使用GROUP BY、ORDER BY或DISTINCT 时。 此类查询分两个阶段执行:第一阶段是收集数据并将其放入临时表中,第二阶段是对临时表执行排序。
在某些UNION语句评估的情况下,对于不能使用合并的VIEW ,对于使用子查询时的派生表,对于多表 UPDATE以及其他一些情况,也需要临时表。
如果临时表很小,则可以创建到内存中,否则,则创建在磁盘上。不用说,内存临时表更快。内存临时表的最大大小由tmp_table_size或max_heap_table_size值定义,以较小者为准。MySQL 5.7 中的默认大小为 16MB。如果您对大量数据运行查询,或者您尚未优化查询,则可以增加变量。设置阈值时,请考虑可用的 RAM 和高峰期间的并发连接数。您不能无限期地增加变量,因为在某些时候您需要让 MySQL 使用磁盘上的临时表。
注意:如果涉及的表具有 TEXT 或 BLOB 列,即使大小小于配置的阈值,也会在磁盘上创建临时表。
临时表存储引擎, 在 MySQL 5.6 之前,所有磁盘临时表均以 MyISAM 类型创建,从 MySQL 5.7 开始,它们默认以 InnoDB 类型创建。有一个新的配置变量可用于设置临时表的存储引擎: internal_tmp_disk_storage_engine。虽然使用 InnoDB 的性能最好,但可能会出现新的潜在问题。在某些特殊情况下,可能会出现磁盘耗尽和服务器中断的情况。
与数据库中的任何其他 InnoDB 表一样,临时表也有自己的表空间文件。新文件与通用表空间一起位于数据目录中,名称为ibtmp1。它存储所有临时表。表空间文件无法缩小,即使文件无法缩小,执行查询后临时表也会自动删除,并且表空间中的空间可供另一个传入查询重新使用。
全局临时表空间(ibtmp1)存储对用户创建的临时表所做更改的回滚段。该innodb_temp_data_file_path 变量定义全局临时表空间数据文件的相对路径、名称、大小和属性。如果未指定 值 ,则默认行为是在 目录中innodb_temp_data_file_path创建一个指定的自动扩展数据文件。初始文件大小略大于 12MB。
必须重启服务器才能完全缩小ibtmp1表空间。全局临时表空间在正常关机或初始化中止时会被删除,并在每次服务器启动时重新创建。