建立記憶體表
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,形成習慣)。
2
|
(id INT, INDEX USING HASH (id))
|
6
|
(id INT, INDEX USING BTREE (id))
|
記憶體表的特性
-
記憶體表的表定義是存放在磁碟上的,副檔名為.frm, 所以重啟不會丟失。
-
記憶體表的資料是存放在記憶體中的,所以重啟會丟失資料。
-
記憶體表使用一個固定的記錄長度格式。
-
記憶體表不支援BLOB或TEXT列,比如varchar與text欄位就不會被支援。
-
記憶體表支援AUTO_INCREMENT列和對可包含NULL值的列的索引(網上大多說不支援,這是錯誤的)。記憶體表支援大於(>) 小於(
-
mysql重啟後,主鍵、自增、索引仍然存在,只是資料丟失。這也是對網上的一些錯誤文字糾正。
-
記憶體表表在所有客戶端之間共享(就像其它任何非TEMPORARY表)。
-
MEMORY儲存引擎執行HASH和BTREE索引。你可以透過新增一個如下所示的USING子句為給定的索引指定一個或另一個:
2
|
(id INT, INDEX USING HASH (id))
|
6
|
(id INT, INDEX USING BTREE (id))
|
-
記憶體表初始化,可以使用--init-file來初始化,避免重啟mysql後資料被清空。比如--init-file="/data/mysql/init.sql", init.sql格式為:
2
|
select *** into m_table;
|
-
在資料庫複製時,如果主機當掉,則會在binLog中自動加入delete from [記憶體表],將slave的資料也刪除掉,以保證兩邊的資料一致性。
-
記憶體表不支援事務。
-
記憶體表是表鎖,當修改頻繁時,效能可能會下降。
記憶體表的使用
記憶體表使用雜湊雜湊索引把資料儲存在記憶體中,因此具有極快的速度,適合快取中小型資料庫,但是使用上受到一些限制。
-
heap對所有使用者的連線是可見的,這使得它非常適合做快取。
-
僅適合使用的場合。heap不允許使用xxxTEXT和xxxBLOB資料型別。注:運算子 “<=>” 說明:NULL-safe equal.這個運算子和“=”運算子執行相同的比較操作,不過在兩個操作碼均為NULL時,其所得值為1而不為NULL,而當一個操作碼為NULL時,其所得值為0而不為NULL。
-
一旦伺服器重啟,所有heap表資料丟失,但是heap表結構仍然存在,因為heap表結構是存放在實際資料庫路徑下的,不會自動刪除。重啟之後,heap將被清空,這時候對heap的查詢結果都是空的。
-
如果heap是複製的某資料表,則複製之後所有主鍵、索引、自增等格式將不復存在,需要重新新增主鍵和索引,如果需要的話。
-
對於重啟造成的資料丟失,有以下的解決辦法:
-
在任何查詢之前,執行一次簡單的查詢,判斷heap表是否存在資料,如果不存在,則把資料重新寫入,或者DROP表重新複製某張表。這需要多做一次查詢。不過可以寫成include檔案,在需要用該heap表的頁面隨時呼叫,比較方便。
-
對於需要該heap表的頁面,在該頁面第一次且僅在第一次查詢該表時,對資料集結果進行判斷,如果結果為空,則需要重新寫入資料。這樣可以節省一次查詢。
-
更好的辦法是在mysql每次重新啟動時自動寫入資料到heap,但是需要配置伺服器,過程比較複雜,通用性受到限制。
小記錄,MyISAM與InnoDB互轉
2
|
ALTER TABLE `tablename` ENGINE = MYISAM
|
4
|
alter table tablename type=innodb;
|
5
|
ALTER TABLE `tablename` ENGINE = InnoDB
|
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26764973/viewspace-1443612/,如需轉載,請註明出處,否則將追究法律責任。