MySQL Merge存儲引擎-實現分表

Merge存儲引擎允許將一組使用MyISAM存儲引擎的並且表結構相同(即每張表的字段順序、字段名稱、字段類型、索引定義的順序及其定義的方式必須相同)的數據表合併爲一個表,方便了數據的查詢。
        假設有log_2004、log_2005、log_2006、log_2007 這四張日誌記錄表,其數據分別是每一年的數據,表結構如下(YY代表年份):

CREATE TABLE log_YY (  
      dt  DATETIME NOT NULL,  
      info VARCHAR(100) NOT NULL,  
      INDEX (dt)  
) ENGINE = MyISAM;

        可以通過如下SQL語句把這些表歸攏爲一個邏輯單元:

CREATE TABLE log_merge(  
        dt DATETIME NOT NULL,  
        info VARCHAR(100) NOT NULL,  
        INDEX(dt)  
) ENGINE = MERGE UNION = (log_2004, log_2005, log_2006, log_2007);

        說明:ENGINE選項的值必須是MERGE;UNION選項列出了將被收錄在這個log_merge數據表的所有表。該log_merge表創建成功後,就可以像普通表那樣查詢它,只是每一次查詢都將同時作用於構成它的每一個成員數據表 。譬如查詢這些日誌數據表的數據行總數:

SELECT COUNT(*) FROM log_merge;

        譬如查詢每年各有多少日誌記錄:

SELECT YEAR(dt) AS y, COUNT(*) AS entries FROM log_merge GROUP BY y;

        創建MERGE存儲引擎的表也支持DELETE 和UPDATE操作。INSERT操作比較麻煩,因爲MySQL需要知道應該把新數據行插入到哪一個成員表裏去。在MERGE存儲引擎數據表的定義裏可以包括一個INSERT_METHOD選項(MySQL4.0之後支持),這個選項的值有NO、FIRST、LAST三個,其含義依次是禁止INSERT操作、將數據行插入到UNION中的第一個表或將數據行插入到UNION中的最後一個表。比如下面SQL語句指定將新數據添加到log_2007數據表----它是UNION選項所列出的最後一個數據表:

CREATE TABLE log_merge(  
        dt DATETIME NOT NULL,  
        info VARCHAR(100) NOT NULL,  
        INDEX(dt)  
) ENGINE = MERGE UNION = (log_2004, log_2005, log_2006, log_2007)  
INSERT_METHOD = LAST;

        創建一個新的成員數據表log_2009並讓它有同樣的表結構,然後修改log_merge數據表把log_2009包括進來:

CREATE TABLE log_2009 LIKE log_2008;  
ALTER TABLE log_merge  
UNION = (log_2004, log_2005, log_2006, log_2007,log_2008,log_2009);

        注意:使用Merge“合併”起來的表結構相同的表最好不要有主鍵,否則會出現這種情況:一共有兩個成員表,其主鍵在兩個表中存在相同情況,但是寫了一條按相同主鍵值查詢的SQL語句,這時只能查到UNION列表中第一個表中的數據。

--------------------- 
作者:不動聲色的蝸牛 
來源:CSDN 
原文:https://blog.csdn.net/gaohuanjie/article/details/50947055 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章