說明:MySQL內存表可以提升一些臨時業務的查詢,比如做Session的共享,一些類似緩存的數據等。
“內存表”顧名思義創建在內存中的表,真是這樣嗎?其實不然,MySQL的內存表,表結構創建在磁盤上,數據存放在內存中,所以當MySQL啟動着的時候,這個表是存在的,數據也是存在的,如果用戶有查看這個表的權限,在所有會話里面,都可以訪問這個內存表的數據;當MySQL重啟后,數據消失,結構還存在。
內存表的創建:
CREATE TABLE test( id int(10), num int(10) ) ENGINE=MEMORY DEFAULT CHARSET=utf8;
查看是否創建成功:
show tables;
使用完內存表后,如果我們想釋放掉占用掉的內存,可以有兩種方法:
-- 刪除數據 delete from test;
或者
-- 清空表 truncate table test;
再或者
-- 刪除表 drop table test;
對於我們常用的功能來說,內存有以下特征:
- 對於varchar等變長類型,內存表使用固定的長度來存放;
- 內存表可以有非唯一鍵;
- 內存表不能包含BLOB或者TEXT列;
- 內存表支持AUTO_INCREMENT列;
- 內存表支持插入延遲,使讀取優先;
- 非臨時內存表和其它非內存表一樣在所有客戶端直接共享;
我們使用內存表的時候,需要注意以下幾個方面:
- 服務器內存足夠大;
- 我們創建的內存表和MySQL內部臨時表有所不同:內存表的數據存放在內存中,而內部臨時表(我們的query語句產生的)在恰當的時候存放在內存中,當內部臨時表變得很大時,MySQL會自動地把它轉化為 在磁盤上存儲的表,而我們創建的內存表,卻不會自動轉換。
- 當我們單獨地delete from 某個內存表的時候,不會回收內存;只有當整個表被delete的時候,才會回收內存;
- 在MySQL的主從服務器上,內存表可以被復制
參考:
https://www.cnblogs.com/sunss/archive/2011/03/16/1986050.html(以上內容轉自此篇文章)
http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html