【Mysql 學習】memory儲存引擎

楊奇龍發表於2011-01-05

      MEMORY儲存引擎用存在記憶體中的內容來建立表。每個MEMORY表和一個磁碟檔案關聯起來。檔名由表的名字開始,並且由一個.frm的副檔名來指明它儲存的表定義。
要建立一個MEMORY表,可使用如下語句:
CREATE TABLE t (i INT) ENGINE = MEMORY;
   如它們名字所指明的,MEMORY表被儲存在記憶體中,且預設使用雜湊索引。這使得它們非常快,並且對建立臨時表非常有用。可是,當伺服器關閉之時,所有儲存在MEMORY表裡的資料被丟失。因為表的定義被存在磁碟上的.frm檔案中,所以表自身繼續存在,在伺服器重啟動時它們是空的。
這個例子顯示你如何可以建立,使用並刪除一個MEMORY表:

mysql> create table tab_memory engine=memory
    -> select id1,id2 ,val
    -> from myisam_auto;
Query OK, 9 rows affected (0.38 sec)
Records: 9  Duplicates: 0  Warnings: 0
MEMORY表有下列特徵:
·以小塊來分配MEMORY表的空間。表對插入使用100%動態雜湊來。不需要溢位區或額外來鍵空間。自由列表無額外的空間需求。已刪除的行被放在一個以連結的列表裡,並且在往表裡插入新資料之時被重新使用。MEMORY表也沒有通常與在雜湊表中刪除加插入相關的問題。
·MEMORY表可以有多達每個表32個索引,每個索引16列,以及500位元組的最大鍵長度。
·MEMORY儲存引擎執行HASH和BTREE索引。你可以透過新增一個如下所示的USING子句為給定的索引指定一個或另一個:
·CREATE TABLE lookup(id INT, INDEX USING HASH (id))ENGINE = MEMORY;
·CREATE TABLE lookup(id INT, INDEX USING BTREE (id)) ENGINE = MEMORY;
也可以使用如下語句建立:

mysql> create index mem_hash using hash on tab_memory(id1);
Query OK, 9 rows affected (0.06 sec)
Records: 9  Duplicates: 0  Warnings: 0

mysql> show index from tab_memory\G
*************************** 1. row ***************************
       Table: tab_memory
  Non_unique: 1
    Key_name: mem_hash
Seq_in_index: 1
 Column_name: id1
   Collation: NULL
 Cardinality: 3
    Sub_part: NULL
      Packed: NULL
        Null:
  Index_type: HASH
     Comment:
1 row in set (0.00 sec)

mysql> drop index mem_hash on tab_memory;
Query OK, 9 rows affected (0.08 sec)
Records: 9  Duplicates: 0  Warnings: 0

mysql> create index mem_hash using BTREE on tab_memory(id1);
Query OK, 9 rows affected (0.06 sec)
Records: 9  Duplicates: 0  Warnings: 0

mysql> show index from tab_memory\G
*************************** 1. row ***************************
       Table: tab_memory
  Non_unique: 1
    Key_name: mem_hash
Seq_in_index: 1
 Column_name: id1
   Collation: A
 Cardinality: NULL
    Sub_part: NULL
      Packed: NULL
        Null:
  Index_type: BTREE
     Comment:
1 row in set (0.02 sec)
B樹的一般特徵和雜湊索引將在以後的部落格中描述。
· 可以在一個MEMORY表中有非唯一鍵。(對雜湊索引的實現,這是一個不常用的功能)。
· 可以對MEMORY表使用INSERT DELAYED。
· 如果你在一個有高度鍵重複的(許多索引條目包含同一個值)MEMORY表上有一個雜湊索引,對影響鍵值的表的更新及所有刪除都是明顯地慢的。這個變慢的程度比例於重複的程度(或者反比於索引cardinality)。你可以使用一個B樹索引來避免這個問題。
·MEMORY表使用一個固定的記錄長度格式。
·MEMORY不支援BLOB或TEXT列。
·MEMORY支援AUTO_INCREMENT列和對可包含NULL值的列的索引。
·MEMORY表在所有客戶端之間共享(就像其它任何非TEMPORARY表)。
·MEMORY表內容被存在記憶體中,記憶體是MEMORY表和伺服器在查詢處理之時的空閒中建立的內部表共享。可是,兩個型別的表不同在於MEMORY表不會遇到儲存轉換,而內部表是:
- 如果一個內部表變得太大,伺服器自動把它轉換為一個磁碟表。尺寸限制由tmp_table_size系統變數的值來確定。
- MEMORY表決不會轉換成磁碟表。要確保你不會偶爾做點傻事,你可以設定max_heap_table_size系統變數給MEMORY表加以最大尺寸。對於單個的表,你也可以在CREATE TABLE語句中指定一個MAX_ROWS表選項。
·伺服器需要足夠記憶體來維持所有在同一時間使用的MEMORY表。
·當你不再需要MEMORY表的內容之時,要釋放被MEMORY表使用的記憶體,你應該執行DELETE FROM或TRUNCATE TABLE,或者整個地刪除表(使用DROP TABLE)。
·當MySQL伺服器啟動時,如果你想開拓MEMORY表,你可以使用--init-file選項。例如,你可以把INSERT INTO ... SELECT 或LOAD DATA INFILE這樣的語句放入這個檔案中以便從持久穩固的的資料來源裝載表。 LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;

·如果你正使用複製,當主伺服器被關閉且重啟動之時,主伺服器的MEMORY表變空。可是從伺服器意識不到這些表已經變空,所以如果你從它們選擇資料,它就返回過時的內容。自從伺服器啟動後,當一個MEMORY表在主伺服器上第一次被使用之時,一個DELETE FROM語句被自動寫進主伺服器的二進位制日誌,因此再次讓從伺服器與主伺服器同步。注意,即使使用這個策略,在主伺服器的重啟和它第一次使用該表之間的間隔中,從伺服器仍舊在表中有過時資料。可是,如果你使用--init-file選項於主伺服器啟動之時在其上推行MEMORY表。它確保這個時間間隔為零。

·在MEMORY表中,一行需要的記憶體使用下列表示式來計算:
SUM_OVER_ALL_BTREE_KEYS(max_length_of_key + sizeof(char*) * 4)+SUM_OVER_ALL_HASH_KEYS(sizeof(char*) * 2)+ ALIGN(length_of_row+1, sizeof(char*))
ALIGN()代表round-up因子,它使得行的長度為char指標大小的確切倍數。sizeof(char*)在32位機器上是4,在64位機器上是8。

 

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

相關文章