【Mysql 學習】 MERGE表方面的問題(二)

楊奇龍發表於2011-01-05

shell> cd /mysql-data-directory/current-database
shell> ls -1 t1 t2 > total.MRG
shell> mysqladmin flush-tables
要重對映一個MERGE表到一個不同的MyISAM表集,你可以執行下列之一:
·DROP MERGE表並且重建它。
·使用ALTER TABLE tbl_name UNION=(...)來改變底層表的列表。
·改變.MRG檔案,並對MERGE表或者所有底層表發出一個FLUSH TABLE語句來強制儲存引擎去讀新的定義檔案。
MERGE表可以幫你解決以下問題:
·容易地管理一套日誌表。比如,你可以把不同月的資料放進分離的表中,用myisampack壓縮其中的一些,並隨後建立一個MERGE表來把它們當作一個來使用。
·獲得更快的速度。你可以以一些標準來分割大的只讀表,然後放進不同磁碟上的單個表中。基於此的一個MERGE表可比使用大表要快得多。
·執行更有效的搜尋。如果你確切知道要搜尋什麼,對一些查詢你可以只在被分割的表的其中之一來搜尋,並且對其它使用MERGE。你甚至有許多不同的MERGE表,它們使用有重疊的表套。
·執行更有效的修補。修補被對映到一個MERGE表中的單個表比修補單個大型表要更輕鬆。
·即刻對映許多表成一個。MERGE表不需要維護它自己的索引,因為它使用大哥表的所用。因此,MERGE表集合是非常塊地建立或重對映。(注意,當你建立一個MERGE表之時,即使沒有索引被建立,你必須仍然指定索引定義)。
·如果根據需要或按照批次,你有一組要合起來作為一個大表的表,你應該根據需要對它們建立一個MERGE表來替代大表。這樣要快得多而且節約大量的磁碟空間。
·超過作業系統的檔案尺寸限制。每個MyISAM表都受制於這個限制,但是一個MyISAM表的集合則不然。
·你可以透過定義一個對映到單個表的MERGE表來為一個MyISAM表建立一個別名或“同物異名”。這樣做應該沒有真實的可察覺的效能影響 (對每個讀只有一些間接呼叫和memcpy()呼叫)。
MERGE表的缺點:
·只能對MERGE表使用僅相同的MyISAM表。
·不能在MERGE表中使用很多MyISAM功能。比如,不能在MERGE表上建立FULLTEXT索引。(可以在底層MERGE 表上建立FULLTEXT索引,但不能用全文搜尋來搜尋MERGE表)。
·如果MERGE表是非臨時的,所有底層MyISAM表也必須是永久的。如果MERGE表是臨時的,MyISAM表可以是任何臨時&非臨時的混合。
·MERGE表使用更多的檔案描述符。如果是個客戶端正使用一個對映到10個表的MERGE表,伺服器使用(10*10)+10個檔案描述符。(10個資料檔案描述符給10個客戶端每人一個,並且在客戶端之間共享10個索引檔案描述符)。
· 鍵讀會更慢。當你讀一個鍵的時候,MERGE儲存引擎需要在所有 底層表上發出一個讀以檢查哪一個接近匹配給定的鍵。如果你隨後做了一個read-next,MERGE儲存引擎需要搜尋讀緩衝來找出下一個鍵。只有當一個鍵緩衝被耗盡,儲存引擎才需要讀下一個鍵塊。這使得MERGE鍵在eq_ref搜尋中非常慢,但在ref搜尋中不是太慢。

下列是已知關於MERGE表的問題:
·如果你使用ALTER TABLE 來把MERGE表變為其它表型別,到底層表的對映就被丟失了。取而代之的,來自底層MyISAM表的行被複制到已更換的表中,該表隨後被指定新型別。
·REPLACE不起作用。
·沒有WHERE子句,或者在任何被對映到一個開啟的MERGE表上的任何一個表上的REPAIR TABLE,TRUNCATE TABLE, OPTIMIZE TABLE或ANALYZE TABLE,你不能使用DROP TABLE, ALTER TABLE, DELETE FROM。如果你這麼做了,MERGE表將仍舊指向原始表,這樣產生意外結果。解決這個不足最簡單的辦法是在執行任何一個這些操作之前發出一個FLUSH TABLES語句來確保沒有MERGE表仍舊保持開啟。
·一個MERGE表不能在整個表上維持UNIQUE約束。當你執行一個INSERT, 資料進入第一個或者最後一個MyISAM表(取決於INSERT_METHOD選項的值)。MySQL確保唯一鍵值在那個MyISAM表裡保持唯一,但不是跨集合裡所有的表。
·當你建立一個MERGE表之時,沒有檢查去確保底層表的存在以及有相同的機構。當MERGE表被使用之時,MySQL檢查每個被對映的表的記錄長度是否相等,但這並不十分可靠。如果你從不相似的MyISAM表建立一個MERGE表,你非常有可能撞見奇怪的問題。
·在MERGE表中的索引的順序和它的底層表中的索引應該一樣。如果你使用ALTER TABLE給一個被用在MERGE表中的表新增一個UNIQUE索引,然後使用ALTER TABLE在MERGE表上新增一個非唯一索引,如果在底層表上已經有一個非唯一索引,對錶的索引排序是不同的。(這是因為ALTER TABLE把UNIQUE索引放在非唯一索引之前以利於重複鍵的快速檢測 )。因此對使用這樣索引的表的查詢可能返回不期望的結果。
·在Windows中,在一個被MERGE表使用的表上DROP TABLE不起作用,因為MERGE引擎的表對映對MySQL的更上層隱藏。因為Windows不允許已開啟檔案的刪除,你首先必須重新整理所有MERGE表(使用FLUSH TABLES)或在移除該表之前移除MERGE表。


 

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

相關文章