mysql資料庫中分區的概念

來源:互聯網
上載者:User

RANGE 分區:基於屬於一個給定連續區間的列值進行分配。。


CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (6),
    PARTITION p1 VALUES LESS THAN (11),
    PARTITION p2 VALUES LESS THAN (16),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);
   LIST 分區:類似RANGE分區,它們的主要區別在於,LIST分區中每個分區的定義和選擇是基於某列的值從屬於一個集合,而RANGE分區是從屬於一個連續區間值的集合

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY LIST(store_id)
    PARTITION pNorth VALUES IN (3,5,6,9,17),
    PARTITION pEast VALUES IN (1,2,10,11,19,20),
    PARTITION pWest VALUES IN (4,12,13,14,18),
    PARTITION pCentral VALUES IN (7,8,15,16)
);
如果試圖插入列值(或分區運算式的傳回值)不在分區值列表中的一行時,那麼“INSERT”查詢將失敗並報錯
  HASH分區:基於使用者定義的運算式的傳回值來進行選擇的分區,該運算式使用將要插入到表中的這些行的列值進行計算。這個函數可以包含MySQL 中有效、產生非負整數值的任何錶達式。
  HASH分區主要用來確保資料在預先確定數目的分區中平均分布。在RANGE和LIST分區中,必須明確指定一個給定的列值或列值集合應該儲存在哪個分區中;而在HASH分區中,MySQL 自動完成這些工作,你所要做的只是基於將要被雜湊的列值指定一個列值或運算式,以及指定被分區的表將要被分割成的分區數量。
  要使用HASH分區來分割一個表,要在CREATE TABLE 語句上添加一個“PARTITION BY HASH (expr)”子句,其中“expr”是一個返回一個整數的運算式。它可以僅僅是欄位類型為MySQL 整型的一列的名字。此外,你很可能需要在後面再添加一個“PARTITIONS num”子句,其中num 是一個非負的整數,它表示表將要被分割成分區的數量。
  CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY HASH(YEAR(hired))
PARTITIONS 4;
MySQL還支援線性雜湊功能,它與常規雜湊的區別在於,線性雜湊功能使用的一個線性2的冪(powers-of-two)運演算法則,而常規 雜湊使用的是求雜湊函數值的模數。
  線性雜湊分割和常規雜湊分割在文法上的唯一區別在於,在“PARTITION BY” 子句中添加“LINEAR”關鍵字,如下面所示:
  CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY LINEAR HASH(YEAR(hired))
PARTITIONS 4;  
按照線性雜湊分割的優點在於增加、刪除、合并和拆分分區將變得更加快捷,有利於處理含有極其大量(1000G)資料的表。它的缺點在於,與使用常規HASH分區得到的資料分布相比,各個分區間資料的分布不大可能均衡。
 
KEY 分區:按照KEY進行分區類似於按照HASH分區,除了HASH分區使用的使用者定義的運算式,而KEY分區的 雜湊函數是由MySQL 伺服器提供。MySQL 簇(Cluster)使用函數MD5()來實現KEY分區;
  對於使用其他儲存引擎的表,伺服器使用其自己內部的 雜湊函數,這些函數是基於與PASSWORD()一樣的運演算法則
  通過線性KEY分割一個表也是可能的。下面是一個簡單的例子:
CREATE TABLE tk (
    col1 INT NOT NULL,
    col2 CHAR(5),
    col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;  
子分區:子分區是分區表中每個分區的再次分割

CREATE TABLE ts (id INT, purchased DATE)
    PARTITION BY RANGE(YEAR(purchased))
    SUBPARTITION BY HASH(TO_DAYS(purchased))
    (
        PARTITION p0 VALUES LESS THAN (1990)
        (
            SUBPARTITION s0,
            SUBPARTITION s1
        ),
        PARTITION p1 VALUES LESS THAN (2000)
        (
            SUBPARTITION s2,
            SUBPARTITION s3
        ),
        PARTITION p2 VALUES LESS THAN MAXVALUE
        (
            SUBPARTITION s4,
            SUBPARTITION s5
        )
    );
子分區可以用於特別大的表,在多個磁碟間分配資料和索引。假設有6個磁碟,分別為/disk0, /disk1, /disk2等。現在考慮下面的例子:
  CREATE TABLE ts (id INT, purchased DATE)
    PARTITION BY RANGE(YEAR(purchased))
    SUBPARTITION BY HASH(TO_DAYS(purchased))
    (
        PARTITION p0 VALUES LESS THAN (1990)
        (
            SUBPARTITION s0
                DATA DIRECTORY = '/disk0/data'
                INDEX DIRECTORY = '/disk0/idx',
            SUBPARTITION s1
                DATA DIRECTORY = '/disk1/data'
                INDEX DIRECTORY = '/disk1/idx'
        ),
        PARTITION p1 VALUES LESS THAN (2000)
        (
            SUBPARTITION s0
                DATA DIRECTORY = '/disk2/data'
                INDEX DIRECTORY = '/disk2/idx',
            SUBPARTITION s1
                DATA DIRECTORY = '/disk3/data'
                INDEX DIRECTORY = '/disk3/idx'
        ),
        PARTITION p2 VALUES LESS THAN MAXVALUE
        (
            SUBPARTITION s0
                DATA DIRECTORY = '/disk4/data'
                INDEX DIRECTORY = '/disk4/idx',
            SUBPARTITION s1
                DATA DIRECTORY = '/disk5/data'
                INDEX DIRECTORY = '/disk5/idx'
        )
    );   分區管理

從一個按照RANGE或LIST分區的表中刪除一個分區,可以使用帶一個DROP PARTITION子句的ALTER TABLE命令來實現

ALTER TABLE tr DROP PARTITION p2;

由“ALTER TABLE ... DROP PARTITION”語句引起的、從表中刪除的行數並沒有被伺服器報告出來

如果希望改變表的分區而又不遺失資料,使用“ALTER TABLE ... REORGANIZE PARTITION”語句
  一個REORGANIZE PARTITION語句也可以用來合并相鄰的分區。可以使用如下的語句恢複成員表到它以前的分區:
  ALTER TABLE members REORGANIZE PARTITION s0,s1 INTO (
    PARTITION p0 VALUES LESS THAN (1970)
);
使用“REORGANIZE PARTITION”拆分或合并分區,沒有資料丟失。在執行上面的語句中,MySQL 把儲存在分區s0和s1中的所有資料都移到分區p0中。

“REORGANIZE PARTITION”的基本文法是:
  ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO (partition_definitions);

不能使用與從按照RANGE或LIST分區的表中刪除分區相同的方式來從HASH或KEY分區的表中刪除分區。但是,可以使用“ALTER TABLE ... COALESCE PARTITION”命令來合并HASH或KEY分區。

COALESCE不能用來增加分區的數量,要增加顧客表的分區數量從12到18,使用“ALTER TABLE ... ADD PARTITION”,具體如下:
  ALTER TABLE clients ADD PARTITION PARTITIONS 18;

mysql由5.1版本開始支援分區,雖然還是not production-ready,但也是值得期待的一個新特性,關於分區,mysql的手冊已經講得比較詳細,以下內容只是從手冊的摘抄:
  分區的一些優點:

  
1)與單個磁碟或檔案系統分區相比,可以儲存更多的資料。

  
2)對於那些已經失去儲存意義的資料,通常可以通過刪除與那些資料有關的分區,很容易地刪除那些資料。相反地,在某些情況下,添加新資料的過程又可以通過為那些新資料專門增加一個新的分區來很方便地實現。

  
3)一些查詢可以得到極大的最佳化,這主要是藉助於滿足一個給定WHERE 語句的資料可以只儲存在一個或多個分區內,這樣在尋找時就不用尋找其他剩餘的分區。因為分區可以在建立了分區表後進行修改,所以在第一次配置資料分割配置時還不曾這麼做時,可以重新組織資料,來提高那些常用查詢的效率。

  
4)涉及到例如SUM() 和 COUNT()這樣彙總函式的查詢,可以很容易地進行平行處理。這種查詢的一個簡單例子如 “SELECT salesperson_id, COUNT(orders) as order_total FROM sales GROUP BY salesperson_id;”。通過“並行”, 這意味著該查詢可以在每個分區上同時進行,最終結果只需通過總計所有分區得到的結果。
  5)通過跨多個磁碟來分散資料查詢,來獲得更大的查詢輸送量。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.