MySQL高級特性-合并表

1. Merge Tables

        如果愿意的話,可以把合并表看成一種較老的、有更多限制的分區表,但是它們也有自己的用處,并且能提供一些分區表不能提供的功能。

合并表實際是容納真正的表的容器??梢允褂锰厥獾腢NION語法來CREATE TABLE。下面是一個合并表的例子:

mysql>   
CREATE TABLE t1(a INT NOT NULL PRIMARY KEY)ENGINE=MyISAM;    
mysql>   
CREATE TABLE t2(a INT NOT NULL PRIMARY KEY)ENGINE=MyISAM;    
mysql>   
INSERT INTO t1(a) VALUES(1),(2);   
mysql>   
INSERT INTO t2(a) VALUES(1),(2);    
mysql>   
CREATE TABLE mrg(a INT NOT NULL PRIMARY KEY)    ENGINE=MERGE UNION=(t1, t2) INSERT_METHOD=LAST;    
mysql> SELECT a FROM mrg;

+——+  
  |  a    |  

+——+  
  |   1  | 
  |   1  | 
  |   2  |  
  |   2  | 
 +——+ 

       注意到合并表包含的表列的數量和類型都是一樣的,并且合并表上的索引也會在下屬表上存在。這是創建合并表的要求。也要注意到在每個表的獨有列上有主鍵,這會導致合并表有重復的行。這是合并表的一個局限:合并表內的每個表行為都很正常,但是它不會對下面的所有表進行強制約束。

  1. INSERT_METHOD=LAST

 指令告訴MySQL把所有的INSERT語句都發送到合并表的最后一個表上。定義FIRST或LAST是控制插入數據位置的唯一方式(但是也可以直接插入到下屬表中)。

分區表可以更多地控制數據存放的位置。

下面的INSERT語句對合并表和下屬表都可見:

mysql> INSERT INTO mrg(a) VALUES(3);    
mysql> SELECT a FROM t2;

 +—+  

  | a | 

 +—+ 

  | 1 | 

  | 2 |

  | 3 | 

 +—+ 

合并表還有其他有趣的特性和限制,比如刪除合并表或它的某個下屬表。刪除合并表讓所有的"子表"都變得不可訪問,但是刪除其中的某個子表有不同的影響,它的行為和操作系統有關。例如,在GNU/Linux上,子表的文件描述符還保持開啟的狀態,并且表還繼續存在,但是只能從合并表中訪問。

  1. mysql> DROP TABLE t1, t2;  mysql> SELECT a FROM mrg

 +——+ 

  | a     | 

 +——+ 

  |     1 | 

  |     1 |  

  |     2 |

  |     2 |

  |     3 | 

 +——+ 

還有一些另外的局限性和特殊行為。最好的辦法是閱讀手冊,但是在這兒要說的是REPLACE并不能在所有的合并表上工作,并且AUTO_INCREMENT不會像你期望的那樣工作。

2. 合并表對性能的影響

        MySQL對合并表的實現對性能有一些重要的影響。和其他MySQL特性一樣,它在某些條件下性能會更好。下面是關于它的一些注意事項:

       1) 合并表比含有同樣數據的非合并表需要更多的文件描述符。盡管合并表看上去是一個表,它實際是逐個打開了下屬表。這樣的結果就是單個表的緩存可以創建許多文件描述符。因此,即使已經配置了表的緩存,讓服務器線程的文件描述符數量不要超過操作系統的限制,合并表仍然有可能導致超過這一限制。

        2) 創建合并表的CREATE語句不會檢查下屬表是否是兼容的。如果下屬表的定義有輕微的不一樣,MySQL會創建合并表,但是卻無法使用。同樣,如果在創建了一個有效的合并表之后對某個下屬表進行了改變,它也會無法工作,并且會顯示下面的錯誤信息:"ERROR 1168(HY000):無法打開定義不同的下屬表,或者非MyISAM表,或者不存在的表"。

       3)訪問合并表的查詢訪問了每一個下屬表。這也許會使單行鍵查找比單個表慢。在合并表中限制下屬表是一個好主意,尤其是它是聯接中的第二個或以后的表。每次操作訪問的數據越少,那么訪問每個表的開銷相對于整個操作而言就越重要。下面是一些如何使用合并表的注意事項:

       4)范圍查找受訪問所有下屬表的開銷的影響小于單個查找。

      對索引表的表掃描和對單個表一樣快。

       一旦唯一鍵和主鍵查詢成功,它們就立即停止。在這種情況下,服務器會挨個訪問下屬表,一旦查找到了值,就不會再查找更多的表。

下屬表讀取的順序和CREAT TABLE語句中定義的一致。如果經常需要按照特定的順序取得數據,可以利用這種特性使合并排序操作更快。

3. 合并表的長處

     合并表在處理數據方面既有積極的一面,也有消極的一面。

      1) 經典的例子就是日志記錄。日志是只追加的,所以可以每天用一個表。每天創建新的表并把它加入到合并表中。也可以把以前的表從合并表中移除掉,把它轉化為壓縮的MyISAM表,再把它們加回到合并表中。

      2) 日志追加這并不是合并表的唯一用途。它們通常都被用于數據倉庫程序,因為它的另一個長處就是管理大量的數據。在實際中不太可能管理一個TB級別的表,但是如果是由單個50GB的表組成的合并表,任務就會簡單很多。

       當管理極其巨大的數據庫時,考慮的絕不僅僅是常規操作。還要考慮崩潰與恢復。使用小表是很好的主意。檢查和修復一系列的小表比起一個大表要快得多,尤其是大表和內存不匹配的時候。還可以并行地檢查和修復多個小表。

       數據倉庫中另外一個顧慮就是如何清理掉老的數據。對巨型表使用DELETE語句最佳狀況下效率不高,而在最壞情況下則是一場災難。但是更改合并表的定義是很簡單的,可以使用DROP TABLE命令刪除老的數據。這可以輕易地實現自動化。

     3) 合并表并非只對日志和大量數據有效。它可以方便地按需創建繁忙的表。創建和刪除合并表的代價是很低的。索引可以像對視圖使用UNION ALL命令那樣使用合并表。但它的開銷更低,因為服務器不會把結果放到臨時表中然后再傳遞給客戶端。這使得它對于報告和倉庫化數據非常有用。例如,要創建一個每晚都會運行的任務,它會把昨天的數據和8天前、15天前、以及之前的每一周的數據進行合并。使用合并表就可以創建無須修改的查詢,并且自動地訪問合適的數據。甚至還可以創建臨時合并表,這是視圖無法做到的。

因為合并表沒有隱藏下屬的MyISAM表,所以它提供了一些分區表無法提供的特性:

一個MyISAM表可以包含很多合并表。

可以通過拷貝.frm、.MYI、.MYD文件在服務器之間拷貝下屬表。

可以輕易地把更多的表添加到合并表中。這只需要創建一個新表并且更改合并定義即可。

可以創建只包含想要的數據的臨時合并表,例如某個特定時間段的數據。這是分區表無法做到的。

如果想對某個表進行備份、恢復、更改、修復,或者其他的操作,可以把它從合并表中移除,完成所有的工作之后再把它加回來。

可以使用myisampack壓縮某些或所有的下屬表。

分區表正好相反,MySQL隱藏了分區表的分區,并只能通過分區表訪問所有的分區

轉自:http://blog.csdn.net/hguisu/article/details/7164356

原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/3112

(0)
s19930811s19930811
上一篇 2015-04-13
下一篇 2015-04-13

相關推薦

  • shell,系統啟動和內核管理

    shell中的for和while循環,Linux的組成,系統啟動的步驟,以及內核的管理

    2017-12-21
  • 4th work

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其他用戶均沒有任何訪問權限。 [root@localhost etc]# cp -r /etc/skel/ /home/tuser1 [root@localhost etc]# chmod go-rwx /home/tuser1/ 2、編輯/etc/gr…

    Linux干貨 2017-10-09
  • 瀏覽和管理log文件

    瀏覽和管理log文件 log文件是一種包含系統消息的文件,包括內核、服務和應用運行在其上。不同的日志文件對應不同的日志信息。例如,默認的系統log文件,一個log文件對應安全消息,一個log文件對應計劃任務。當要對一個系統問題排錯例如加載內核驅動或者當尋找對系統的非授權登錄攻擊,日志文件是很有幫助的。一些log文件被一個稱之為rsyslogd的守護進程控制?!?/p>

    Linux干貨 2017-05-15
  • Linux基礎指令(2)

    4.文件的元數據信息有哪些,分別表示什么含義,如何查看?如何修改文件的時間戳信息?  元數據定義:      數據(Metadata),又稱中介數據、中繼數據,為描述 數據的數據(data about data),主要是描述數據屬性(property)的信息,用來支持如…

    Linux干貨 2016-11-09
  • 馬哥教育網絡班21期+第6周課程練習

    VIM基礎知識 常用模式: 編輯模式–>命令模式 輸入模式 末行模式:內置的命令行接口 模式轉換: 編輯模式–>輸入模式 i:在光標所在處前轉換為輸入模式; a:在光標所在后面轉入輸入模式; o:在當前光標所在行的下方打開一個新行,并轉為輸入模式; I:在當前光標所在行的行首輸入; A:在當前光標所在行的行尾輸入; O:在當前光標所在行的上方…

    Linux干貨 2016-08-15
  • 計算機原理

    計算機由CPU、存儲器、輸入設備、輸出設備組成。 CPU的功能:對數據運算加工,控制設備等 存儲器的功能:存儲數據,加載程序 輸入設備:下指令,提供數據等 輸出設備:輸出數據加工的結果 linux發行版本:Debian:ubuntu、knopix Slackware:S.u.S.E、SLES、openSUSE RedHat:Redhat 9.0、RedHat…

    Linux干貨 2017-12-04
欧美性久久久久