在SQL包含union、group by等操作时,执行计划可能会显示using temporary,表示用到临时表,此时这个是内部临时表;
而memory引擎的表,由于数据存储在内存,实例关闭时不保存数据,也被称为临时表;
通过create temporary table test (...) engine=innodb/myisam
,也被称为临时表;
这么多临时表,很容易混淆,怎么区分呢?
1.内部临时表
内部临时表是在SQL执行过程临时创建的堆组织表,例如用于处理数据去重,新建一个内部临时表,在列上创建一个唯一索引;
内部临时表默认是存放在内存,但由tmp_table_size
控制空间上限,一旦超过上限,就会转换成由default_tmp_storage_engine
指定的引擎的磁盘表,存放在磁盘上;
也就是说,当内部临时表超过了阈值tmp_table_size
,就会有一个由堆表向索引组织表的转换(如果default_tmp_storage_engine=innodb
)。
2.memory表
memory表是指memory引擎表,如create table test(...) engine=memory
;
注意建表语句中并没有temporary字样,所以严格来说,并不是临时表,只是由于表数据存放在内存上,拥有数据易失的特性;
memory引擎表同样是堆组织表,由 max_heap_table_size决定增长上线,但不会转换成磁盘表。
3.innodb/myisam temporary表
innodb/myisam temporary表是指建表语句为以下的表:
create temporary table test (...) engine=innodb/myisam;
这种临时表具有对应存储引擎的表组织结构,engine=innodb即索引组织表,engine=myisam即堆组织表;
无论是innodb或myisam的temporary表,数据都是直接存储在磁盘上的。