memory儲存引擎 /MySQL記憶體表的特性與使用介紹

huzhichengforce發表於2015-02-28
建立記憶體表
create table table_name (column_name type) engine=memory ;
c檢視建立的標定義
>show create table table_name
1、memory 儲存引擎表只有一個獨立的磁碟檔案,副檔名為.frm memory 儲存引擎只存放表定義不存放資料。
2、當伺服器斷電後記憶體表中的資料全部丟失,但表結構是會保留的因為有.frm檔案儲存
3、分配給儲存引擎的記憶體正常狀態不會回收,由memory引擎一直持有,即使刪除儲存引擎表的資料,所佔用的記憶體也不會被伺服器回收
刪除表記錄釋放的記憶體重新使用。只有當memory表被刪除或者重建時伺服器回收記憶體。
4、memory引擎表的記憶體佔用,由兩個因素決定(1).不能超過max_heap_table_size (預設為16M)(2).t透過建立表的時候制定max_rows z指定。
5、max_heap_table_size 指的是單張表大小
--------------------------------------------

記憶體表,就是放在記憶體中的表,所使用記憶體的大小可透過My.cnf中的max_heap_table_size指定,如max_heap_table_size=1024M,記憶體表與臨時表並不相同,臨時表也是存放在記憶體中,臨時表最大所需記憶體需要透過tmp_table_size = 128M設定。當資料超過臨時表的最大值設定時,自動轉為磁碟表,此時因需要進行IO操作,效能會大大下降,而記憶體表不會,記憶體表滿後,會提示資料滿錯誤。

臨時表和記憶體表都可以人工建立,但臨時表更多的作用是系統自己建立後,組織資料以提升效能,如子查詢,臨時表在多個連線之間不能共享。這裡只討論記憶體表

建立表是,用engine=heap可建立(mysql5.5中已經不支援type,以後都用engine,形成習慣)。


CREATE TABLE lookup
2 (id INT, INDEX USING HASH (id))
3 ENGINE = MEMORY;
4

5 CREATE TABLE lookup
6 (id INT, INDEX USING BTREE (id))
7 ENGINE = MEMORY;

記憶體表的特性

  1. 記憶體表的表定義是存放在磁碟上的,副檔名為.frm, 所以重啟不會丟失。
  2. 記憶體表的資料是存放在記憶體中的,所以重啟會丟失資料。
  3. 記憶體表使用一個固定的記錄長度格式。
  4. 記憶體表不支援BLOB或TEXT列,比如varchar與text欄位就不會被支援。
  5. 記憶體表支援AUTO_INCREMENT列和對可包含NULL值的列的索引(網上大多說不支援,這是錯誤的)。記憶體表支援大於(>) 小於( 
  6. mysql重啟後,主鍵、自增、索引仍然存在,只是資料丟失。這也是對網上的一些錯誤文字糾正。
  7. 記憶體表表在所有客戶端之間共享(就像其它任何非TEMPORARY表)。
  8. MEMORY儲存引擎執行HASH和BTREE索引。你可以透過新增一個如下所示的USING子句為給定的索引指定一個或另一個:
  9. 1 CREATE TABLE lookup
    2 (id INT, INDEX USING HASH (id))
    3 ENGINE = MEMORY;
    4

    5 CREATE TABLE lookup
    6 (id INT, INDEX USING BTREE (id))
    7 ENGINE = MEMORY;
  10. 記憶體表初始化,可以使用--init-file來初始化,避免重啟mysql後資料被清空。比如--init-file="/data/mysql/init.sql", init.sql格式為:
  11. 1 use db_test;
    2 select *** into m_table;
  12. 在資料庫複製時,如果主機當掉,則會在binLog中自動加入delete from [記憶體表],將slave的資料也刪除掉,以保證兩邊的資料一致性。
  13. 記憶體表不支援事務。
  14. 記憶體表是表鎖,當修改頻繁時,效能可能會下降。

記憶體表的使用

記憶體表使用雜湊雜湊索引把資料儲存在記憶體中,因此具有極快的速度,適合快取中小型資料庫,但是使用上受到一些限制。

  1. heap對所有使用者的連線是可見的,這使得它非常適合做快取。
  2. 僅適合使用的場合。heap不允許使用xxxTEXT和xxxBLOB資料型別。注:運算子 “<=>” 說明:NULL-safe equal.這個運算子和“=”運算子執行相同的比較操作,不過在兩個操作碼均為NULL時,其所得值為1而不為NULL,而當一個操作碼為NULL時,其所得值為0而不為NULL。
  3. 一旦伺服器重啟,所有heap表資料丟失,但是heap表結構仍然存在,因為heap表結構是存放在實際資料庫路徑下的,不會自動刪除。重啟之後,heap將被清空,這時候對heap的查詢結果都是空的。
  4. 如果heap是複製的某資料表,則複製之後所有主鍵、索引、自增等格式將不復存在,需要重新新增主鍵和索引,如果需要的話。
  5. 對於重啟造成的資料丟失,有以下的解決辦法:
  • 在任何查詢之前,執行一次簡單的查詢,判斷heap表是否存在資料,如果不存在,則把資料重新寫入,或者DROP表重新複製某張表。這需要多做一次查詢。不過可以寫成include檔案,在需要用該heap表的頁面隨時呼叫,比較方便。
  • 對於需要該heap表的頁面,在該頁面第一次且僅在第一次查詢該表時,對資料集結果進行判斷,如果結果為空,則需要重新寫入資料。這樣可以節省一次查詢。
  • 更好的辦法是在mysql每次重新啟動時自動寫入資料到heap,但是需要配置伺服器,過程比較複雜,通用性受到限制。

小記錄,MyISAM與InnoDB互轉

1 // InnoDB轉MyISAM
2 ALTER TABLE `tablename` ENGINE = MYISAM
3 // MyISAM轉InnoDB
4 alter table tablename type=innodb;
5 ALTER TABLE `tablename` ENGINE = InnoDB

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26764973/viewspace-1443612/,如需轉載,請註明出處,否則將追究法律責任。

相關文章