首先,臨時表只在當前鏈接可見,當關閉鏈接時,Mysql會自動刪除表並釋放全部空間。所以在不一樣的鏈接中能夠建立同名的臨時表,而且操做屬於本鏈接的臨時表。mysql
建立臨時表的語法與建立表語法相似,不一樣之處是增長關鍵字TEMPORARY,如:sql
CREATE TEMPORARY TABLE 表名 (…. )服務器
臨時表使用有一些限制條件:函數
* 臨時表在 memory、myisam、merge或者innodb上使用,而且不支持mysql cluster簇);性能
show tables語句不會列出臨時表,在information_schema中也不存在臨時表信息;show create table能夠查看臨時表;大數據
* 不能使用rename來重命名臨時表。可是能夠alter table rename代替:ui
mysql>ALTER TABLE orig_name RENAME new_name;rest
* 能夠複製臨時表獲得一個新的臨時表,如:orm
mysql>create temporary table new_table select * from old_table;server
* 但在同一個query語句中,相同的臨時表只能出現一次。如:
可使用:mysql> select * from temp_tb;
但不能使用:mysql> select * from temp_tb, temp_tb as t;
錯誤信息: ERROR 1137 (HY000): Can't reopen table: 'temp_tb'
一樣相同臨時表不能在存儲函數中出現屢次,若是在一個存儲函數裏,用不一樣的別名查找一個臨時表屢次,或者在這個存儲函數裏用不一樣的語句查找,都會出現這個錯誤。
* 但不一樣的臨時表能夠出如今同一個query語句中,如臨時表temp_tb1, temp_tb2:
Mysql> select * from temp_tb1, temp_tb2;
臨時表能夠手動刪除:
DROP TEMPORARY TABLE IF EXISTS temp_tb;
臨時表主要用於對大數據量的表上做一個子集,提升查詢效率。
在建立臨時表時聲明類型爲HEAP,則Mysql會在內存中建立該臨時表,即內存表:如:
CREATE TEMPORARY TABLE 表名 (。。。。) TYPE = HEAP
由於HEAP表存儲在內存中,你對它運行的查詢可能比磁盤上的臨時錶快些。如:
mysql> create temporary table temp_tb type='heap' select * from temptb;
Query OK, 0 rows affected, 1 warning (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table temp_tb \G;
*************************** 1. row ***************************
Table: temp_tb
Create Table: CREATE TEMPORARY TABLE `temp_tb` (
`id` int(10) unsigned NOT NULL DEFAULT '0',
`Name` char(20) NOT NULL,
`Age` tinyint(4) NOT NULL
) ENGINE=MEMORY DEFAULT CHARSET=gbk
1 row in set (0.00 sec)
ERROR:
No query specified
能夠看出來臨時表和內存表的ENGINE 不一樣,臨時表默認的是Mysql指定的默認Engine,而內存表是MEMORY。
官方手冊:
As indicated by the name, MEMORY tables are stored in memory. They use hash indexes by default, which makes them very fast, and very useful for creating temporary tables. However, when the server shuts down, all rows stored in MEMORY tables are lost. The tables themselves continue to exist because their definitions are stored in .frm files on disk, but they are empty when the server restarts.
內存表的創建還有一些限制條件:
MEMORY tables cannot contain BLOB or TEXT columns. HEAP不支持BLOB/TEXT列。
The server needs sufficient memory to maintain all MEMORY tables that are in use at the same time. 在同一時間須要足夠的內存.
To free memory used by a MEMORY table when you no longer require its contents, you should execute DELETE or TRUNCATE TABLE, or remove the table altogether using DROP TABLE.爲了釋放內存,你應該執行DELETE FROM heap_table或DROP TABLE heap_table。
臨時表和內存表
臨時表主要是爲了放一些中間大結果集的一些子集,內存表能夠放一些常常頻繁使用的數據。
* 臨時表:表建在內存裏,數據在內存裏
* 內存表:表建在磁盤裏,數據在內存裏
臨時表和內存表所使用內存大小能夠經過My.cnf中的max_heap_table_size、tmp_table_size指定:
[mysqld]
max_heap_table_size=1024M #內存表容量
tmp_table_size=1024M #臨時表容量
當數據超過臨時表的最大值設定時,自動轉爲磁盤表,此時因須要進行IO操做,性能會大大降低,而內存表不會,內存表滿後,則會提示數據滿錯誤。
show tables 命令不會顯示臨時表。
如下是對內存表和臨時表之間區別的總結:
內存表:
1.缺省存儲引擎爲MEMORY
2.能夠經過參數max_heap_table_size來設定內存表大小
3.到達max_heap_table_size設定的內存上限後將報錯
4.表定義保存在磁盤上,數據和索引保存在內存中
5.不能包含TEXT、BLOB等字段
臨時表:
1.缺省存儲引擎爲MySQL服務器默認引擎,引擎類型只能是:memory(heap)、myisam、merge、innodb(memory臨時表因爲表的增大可能會轉變爲myisam臨時表)
2.能夠經過參數 tmp_table_size 來設定臨時表大小。
3.到達tmp_table_size設定的內存上限後將在磁盤上建立臨時文件
4.表定義和數據都保存在內存中
5.能夠包含TEXT, BLOB等字段
臨時表通常比較少用,一般是在應用程序中動態建立或者由MySQL內部根據SQL執行計劃須要本身建立。
內存表則大多做爲Cache來使用,特別在沒有第三方cache使用時。現在隨着memcache、NoSQL的流行,愈來愈少選擇使用內存表。
MySQL服務器使用內部臨時表
在某些狀況下,mysql服務器會自動建立內部臨時表。查看查詢語句的執行計劃,若是extra列顯示「using temporary」即便用了內部臨時表。內部臨時表的建立條件:
* group by 和 order by中的列不相同
* order by的列不是引用from 表列表中 的第一表
* group by的列不是引用from 表列表中 的第一表
* 使用了sql_small_result選項
* 含有distinct 的 order by語句
初始建立內部myisam臨時表的條件:
* 表中存在text、blob列
* 在group by中的 列 有超過512字節
* 在distinct查詢中的 列 有超過512字節
* 在union、union all聯合查詢中,select 列 列表中的 列 有超過512字節的