mysql之分割槽表小結1

myownstars發表於2012-12-25

同一表的所有分割槽必須使用同一個的儲存引擎

 

如何禁止分割槽

啟動伺服器時指定—skip-partition,但所有分割槽表都不可訪問

 

檢視當前是否支援分割槽

mysql> SHOW VARIABLES LIKE '%partition%';

 

+-------------------+-------+

| Variable_name     | Value |

+-------------------+-------+

| have_partitioning | YES   |

+-------------------+-------+

1 row in set (0.00 sec)

 

mysql> SHOW PLUGINS;

+------------+----------+----------------+---------+---------+

| Name       | Status   | Type           | Library | License |

+------------+----------+----------------+---------+---------+

| binlog     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| partition  | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| ARCHIVE    | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| BLACKHOLE  | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| CSV        | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| FEDERATED  | DISABLED | STORAGE ENGINE | NULL    | GPL     |

| MEMORY     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| InnoDB     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| MRG_MYISAM | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| MyISAM     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |

| ndbcluster | DISABLED | STORAGE ENGINE | NULL    | GPL     |

+------------+----------+----------------+---------+---------+

11 rows in set (0.00 sec)

 

Mysql5.5在已有的range/list分割槽上引入新的分割槽型別,分別為range/list columns,主要有兩個改進:

1 支援多列分割槽  2 分割槽列支援非整數型別,包括varchar/char/data/datatime

 

Range columns

CREATE TABLE rc4 (

    a INT,

    b INT,

    c INT

)

PARTITION BY RANGE COLUMNS(a,b,c) (

    PARTITION p0 VALUES LESS THAN (0,25,50),

    PARTITION p1 VALUES LESS THAN (10,20,100),

    PARTITION p2 VALUES LESS THAN (10,30,50)

    PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE,MAXVALUE)

 );

 

mysql> SELECT (0,25,50) < (10,20,100), (10,20,100) < (10,30,50);

+-------------------------+--------------------------+

| (0,25,50) < (10,20,100) | (10,20,100) < (10,30,50) |

+-------------------------+--------------------------+

|                       1 |                        1 |

+-------------------------+--------------------------+

1 row in set (0.00 sec)

 

List columns

CREATE TABLE customers_1 (

    first_name VARCHAR(25),

    last_name VARCHAR(25),

    street_1 VARCHAR(30),

    street_2 VARCHAR(30),

    city VARCHAR(15),

    renewal DATE

)

PARTITION BY LIST COLUMNS(city) (

    PARTITION pRegion_1 VALUES IN('Oskarshamn', 'Högsby', 'Mönsterås'),

    PARTITION pRegion_2 VALUES IN('Vimmerby', 'Hultsfred', 'Västervik'),

    PARTITION pRegion_3 VALUES IN('Nässjö', 'Eksjö', 'Vetlanda'),

    PARTITION pRegion_4 VALUES IN('Uppvidinge', 'Alvesta', 'Växjo')

);

 

Linear Hash分割槽

除了普通的hash分割槽,mysql還支援linear hash分割槽,兩者區別在於hash演算法,linear hash使用powers-of-two而前者使用modulus,語法上唯一的區別hash前多一個關鍵字linear

 

優勢:增刪/合併/分割分割槽操作速度更快,尤其是TB級別的資料處理;

劣勢:資料分佈相對不會那麼均勻

 

演算法實現

假定分割槽數目為num,表示式函式為f()

普通hash分割槽:N = MOD(f, num)

Linear hash分割槽:首先計算出V = power(2, ceiling(log(2, num))) N = f(column) & (V -1),如果N小於num則將其插入第N個分割槽,否則繼續對N計算 N = num & ceiling(V / 2)

--建立linear hash分割槽表,分割槽數6

CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE)

    PARTITION BY LINEAR HASH( YEAR(col3) )

    PARTITIONS 6;

--插入兩條記錄,col3分別為’2003-04-14’’1998-10-19’,則依照前述計算規則

--‘2003-04-14’

V = power(2, ceiling(log(2, 6))) = 8, N = year(‘2003-04-14’) & (8 – 1) = 2003 & 7 = 3;將其插入第3個分割槽

--‘1998-10-19’

V = 8, N= year(‘1998-10-19’) & (8 – 1) = 1998 & 7 = 6; N = num則繼續計算N = 6 & ceiling(8 / 2) = 6 & 4 = 4;將其插入第4個分割槽

 

 

KEY分割槽

hash分割槽區別在於hash函式由mysql提供:mysql cluster採用MD5(),其他儲存引擎各自使用基於password()dhash演算法;分割槽列必須為主鍵的一部分,且不侷限於整數型別;支援linear key分割槽;

 

子分割槽

對於range/list分割槽表,mysql支援包括key/hash在內的子分割槽

 

如何處理NULL

若分割槽列出現null,則其比任何non-null值都要小;

對於range分割槽表,分割槽列為null的行總是插入第一個分割槽;

對於list分割槽表,除非分割槽list值顯示指定了null,否則插入失敗;

對於hash/key分割槽表,null被當作0處理;

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

相關文章