記憶體表,就是放在記憶體中的表,所使用記憶體的大小可通過my.cnf中的max_heap_ta指定,如max_heap_table_size=1024m,記憶體表與臨時表並不相同,臨時表也是存放在記憶體中,臨時表最大所需記憶體需要通過tmp_table_size = 128m設定。當資料超過臨時表的最大值設定時,自動轉為磁碟表,此時因需要進行io操作,效能會大大下降,而記憶體表不會,記憶體表滿後,會提示資料滿錯誤。
臨時表和記憶體表都可以人工建立,但臨時表更多的作用是系統自己建立後,組織資料以提公升效能,如子查詢,臨時表在多個連線之間不能共享。這裡只討論記憶體表
建立表是,用engine=heap可建立(mysql5.5中已經不支援type,以後都用engine,形成習慣)。
create table test
( id int unsigned not null auto_increment primary key,
state char(10),
type char(20),
date char(30)
)engine=memory default charset=utf8;
記憶體表的特性
1.對於varchar等變長型別,記憶體表使用固定的長度來存放;
2.記憶體表可以有非唯一鍵;
3.記憶體表不能包含blob或者text列;
4.記憶體表支援auto_increment列;
5.記憶體表支援插入延遲,使讀取優先;
6.非臨時記憶體表和其它非記憶體表一樣在所有客戶端直接共享;
我們使用記憶體表的時候,需要注意以下幾個方面:
1.伺服器記憶體足夠大;
2.我們建立的記憶體表和mysql內部臨時表有所不同:
www.cppcns.com 記憶體表的資料存放在記憶體中,而內部臨時表(我們的query語句產生的)在恰當的時候存放在記憶體中,當內部臨時表變得很大時,mysql會自動地把它轉化為 在磁碟上儲存的表,而我們建立的記憶體表,卻不會自動轉換。
3.當我們單獨地delete from 某個記憶體表的時候,不會**記憶體;只有當整個表被delete的時候,才會**記憶體;
4.在mysql的主從伺服器上,記憶體表可以被複製
記憶體表的一些使用限制
mysql記憶體表使用雜湊雜湊索引把資料儲存在記憶體中,因此具有極快的速度,適程式設計客棧合快取中小型資料庫,但是使用上受到一些限制。
1、heap對所有使用者的連線是可見的,這使得它非常適合做快取。
2、僅適合使用的場合。heap不允許使用***text和***blob資料型別;只允許使用=和<=>操作符來搜尋記錄(不允許& lt;、>、<==);不支援auto_increment;只允許對非空資料列進行索引(not null)。
注:操作符 「<=>」 說明:null-safe equal.這個操作符和「=」操作符執行相同的比較操作,不過在兩個操作碼均為null時,其所得值為1而不為null,而當乙個操作碼為null時,其所得程式設計客棧值為0而不為null。
3、一旦伺服器重啟,所有heap表資料丟失,但是heap表結構仍然存在,因為heap表結構是存放在實際資料庫路徑下的,不會自動刪除。重啟之後,heap將被清空,這時候對heap的查詢結果都是空的。
4、如果heap是複製的某資料表,則複製之後所有主鍵、索引、程式設計客棧自增等格式將不復存在,需要重新新增主鍵和索引,如果需要的話。
5、對於重啟造成的資料丟失,有以下的解決辦法:
a、在任何查詢之前,執行一次簡單的查詢,判斷heap表是否存在資料,如果不存在,則把資料重新寫入,或者drop表重新複製某張表。這需要多做一次查詢。不過可以寫成include檔案,在需要用該heap表的頁面隨時呼叫,比較方便。
b、對於需要該heap表的頁面,在該頁面第一次且僅在第一次查詢該錶時,對資料集結果進行判斷,如果結果為空,則需要重新寫入資料。這樣可以節省一次查詢。
c、更好的辦法是在mysql每次重新啟動時自動寫入資料到heap,但是需要配置伺服器,過程比較複雜,通用性受到限制。
藍草目前採用的是第二種辦法。
6、一些預期可能用到的sql語句
//如果表存在,則刪除
drop table if exists `abc`;
//複製整張表xyz為heap表abc(包含所有資料)
create table `abc` type=heap select * from `xyz`;
//新增主鍵id
alter table `abc` add primary key (`id`);
//新增索引username
alter table `abc` add index `abc` (`username`);
本文標題: mysql的記憶體表的基礎學習教程
本文位址:
mysql記憶體表 MySQL的記憶體表
記憶體表 顧名思義建立在記憶體中的表,真是這樣嗎?其實不然,mysql的記憶體表,表結構建立在磁碟上,資料存放在記憶體中,所以當mysql啟動著的時候,這個表是存在的,資料也是存在的,如果使用者有檢視這個表的許可權,在所有會話裡面,都可以訪問這個記憶體表的資料 當mysql重啟後,資料消失,結構還存...
mysql記憶體表 mysql建立記憶體表的方法
如何建立記憶體表?建立記憶體表非常的簡單,只需註明 engine memory 即可 複製 如下 create table tablename columnname varchar 256 not nul engine memory default charset latin1 max rows 1...
mysql記憶體表 mysql建立記憶體表的方法
如何建立記憶體表?建立記憶體表非常的簡單,只需註明 engine memory 即可 create table tablename columnname varchar 256 not nul engine memory default charset latin1 max rows 1000000...