MySQL临时表

MySQL 临时表

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

临时表在MySQL 3.23版本中添加,如果你的MySQL版本低于 3.23版本就无法使用MySQL的临时表。不过现在一般很少有再使用这么低版本的MySQL数据库服务了。

MySQL临时表只在当前连接可见,如果你使用PHP脚本来创建MySQL临时表,那没当PHP脚本执行完成后,该临时表也会自动销毁。

如果你使用了其他MySQL客户端程序连接MySQL数据库服务器来创建临时表,那么只有在关闭客户端程序时才会销毁临时表,当然你也可以手动销毁。

官方参考:http://dev.mysql.com/doc/refman/5.6/en/internal-temporary-tables.html

当某些SQL命令在MySQL数据库中被执行的时候,它可能需要先创建一些内部的临时表来完成比较复杂的排序或分组查询。MySQL的临时表分为 in-memory 和 on-disk 两种。 如有可能,MySQL 总是首先使用 in-memory 的临时表,而当临时表变得太大的时候,也可能被转存为 on-disk 的临时表。

如下几个条件下可能导致SQL命令需要创建临时表:


  * 使用了不同的ORDER BY和GROUP BY条件,或它们包含了JOIN查询中非首先表的字段;
  * 同时使用了DISTINCT和ORDER BY;
  * 如果SQL命令使用了SQL_SMALL_RESULT选项,那么需要时将创建in-memory临时表,除非查询中还包含有需用 on-disk 存储的元素;


一些条件下可能阻碍使用in-memory临时表, 导致MySQL改用on-disk临时表:

  * 数据表中含有BLOB类型或TEXT类型字段列;
  * 在GROUP BY或DISTINCT任何条件中含有超过512字节的列;
  * 如果使用了UNION或UNION ALL,而且SELECT列中含有任何超过512字节的列;
  * 如果in-memory临时表变得太大,超过tmp_table_size或max_heap_table_size数值时;

MySQL数据库用Created_tmp_tables和Created_tmp_disk_tables变量记录所用临时表的数目;

当你创建临时表的时候,你可以使用temporary关键字。如:

create temporary table tmp_table(name varchar(10) not null,passwd char(6) not null)
  

CREATE TEMPORARY TABLE IF NOT EXISTS sp_output_tmp ENGINE = MEMORY SELECT …from … where ID=current_id;

   临时表只在当前连接可见,当这个连接关闭的时候,会自动drop。这就意味着你可以在两个不同的连接里使用相同的临时表名,并且相互不会冲突,或者使用 已经存在的表,但不是临时表的表名。(当这个临时表存在的时候,存在的表被隐藏了,如果临时表被drop,存在的表就可见了)。创建临时表你必须有 create temporary table 权限。

下面几点是临时表的限制:

1. 临时表只能用在 memory,myisam,merge,或者innodb

2. 临时表不支持mysql cluster(簇)

3. 在同一个query语句中,你只能查找一次临时表。例如:下面的就不可用
mysql> SELECT * FROM temp_table, temp_table AS t2;
ERROR 1137: Can't reopen table: 'temp_table'

猜你喜欢

转载自justcoding.iteye.com/blog/2196010