临时表和复制表

临时表概念

临时表是在需要保存一些临时数据时使用的。临时表只在当前连接可见,当关闭连接时,数据库会自动删除临时表并释放所有空间。

MySQL两种临时表

1、外部临时表,通过create temporary table语法创建的临时表,可以指定存储引擎为memory,innodb, myisam等等,这类表在会话结束后,会被自动清理。如果临时表与非临时表同时存在,那么非临时表不可见。show tables命令不显示临时表信息,可通过information_schema.temporary_tables系统表可以查看外部临时表的相关信息。
2、内部临时表,通常在执行复杂SQL,比如group by, order by, distinct, union等等,执行计划中如果包含Using temporary,那么MySQL内部将使用自动生成的临时表,以辅助SQL的执行。

创建临时表

通过CREATE TEMPORARY TABLE创建临时表,临时表的创建和普通表类似。临时表插入数据和普通表插入数据是一样的操作。

删除临时表

默认情况下,当断开与数据库的连接后,临时表就会自动被销毁。当然也可以使用DROP TABLE 命令来手动删除临时表。

MySQL临时表可能导致磁盘可用空间减少

在MySQL5.7版本之前,临时表的存储引擎默认为myisam,myisam临时表在SQL执行结束后,会自动删除临时表。然而从5.7版本开始,临时表的默认存储引擎变为innodb,虽然在性能上有了一定的提升,但是由于innodb引擎的临时表共用表空间ibtmp1,导致在高并发下,多个session同时创建临时表时,该表空间会变得非常大,并且不能动态缩小,除非重启MySQL,否则无法释放。

复制表

1、只复制表结构到新表
语句:CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2
或CREATE TABLE 新表 LIKE 旧表
!注:WHERE 1=2即条件不成立,第一个语句的意思是把旧表所有符合条件的数据复制到新表但是条件不成立因此只复制结构而没有数据;前一种方式复制时主键类型和自增方式不会复制过去的,而后一种方式是把旧表的所有字段类型都复制到新表。
2、复制表结构及数据到新表
语句:CREATE TABLE 新表SELECT * FROM 旧表
3、复制旧表的数据到新表(假设两个表结构一样)
语句:INSERT INTO 新表SELECT * FROM 旧表
4、复制旧表的数据到新表(假设两个表结构不一样)
语句:INSERT INTO 新表(字段1,字段2,···) SELECT 字段1,字段2,··· FROM 旧表

你可能感兴趣的:(临时表和复制表)