1. 程式人生 > >Mysql 分區介紹(一) ——概述

Mysql 分區介紹(一) ——概述

mysql分區

一、分區類型

1. RANGE類型(範圍分區)

通過範圍的方式進行分區, 為每個分區給出一定的範圍, 範圍必須是連續的並且不能重復, 使用VALUES LESS THAN操作符

啥意思呢? 就是range類型就是一種範圍, 比如, 從1-10, 11-20, 21-30這種的方式分區, 1-10就在一個分區裏, 11-20是另外一個分區, 但是看起來他們還是同一個表 <br />

咱們看一個創建的例子

CREATE TABLE `t1` (
  `id` int(11) NOT NULL,
  `uid` int(11) NOT NULL COMMENT ‘用戶id‘,
  `score` int(3) NOT NULL DEFAULT ‘0‘ COMMENT ‘分數‘,
  PRIMARY KEY (`id`,`score`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE (score)
(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB,
 PARTITION p1 VALUES LESS THAN (20) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (30) ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN (40) ENGINE = InnoDB)

創建了個t1表, 並且t1有四個分區, 第一個分區p0的範圍是小於10的, 第二個是小於20的。這就是一個range分區的例子。 <br />
那為啥主鍵定義的是雙主鍵呢? 因為分區鍵(score) 必須也是主鍵或者唯一鍵的一部分。

2. LIST分區

LIST不同於RANGE分區, 每個分區必須被顯式的定義, 每個分區是根據列值的成員在一組列表中的元素定義的

這說的有點亂, 還是直接看一個創建的例子吧

create table t2 (
    id int not null,
    uid int not null comment ‘用戶id‘,
    score int(3) not null default 0 comment ‘分數‘,
    primary key(id, uid)
)
partition by list(uid) (
    partition p0 values in (1,3,5,7,9),
    partition p1 values in (2,4,6,8,10)
)

t2的分區鍵是uid, 有兩個分區(這個很明顯嘛), 如果uid in (1,3,5,7,9), 那麽這條數據就會保存在p0中, 如果是2,4,6,8,10的話, 就會在p1中, 這就是LIST 分區

3. COLUMNS 分區

COLUMNS和以上兩種是很不一樣的, 這個是可以用多個分區鍵確定分區的。有兩種方式, RANGE COLUMNS 和 LIST COLUMNS

1. RANGE COLUMNS 分區

類似RANGE 分區, 但是可以使用一個或多個字段值定義

不太好理解... 還是看例子吧

create table t3 (
    a int,
    b int,
    c char(3),
    d int
)
PARTITION BY RANGE COLUMNS(a,d,c) (
PARTITION p0 VALUES LESS THAN (5,10,‘ggg‘),
PARTITION p1 VALUES LESS THAN (10,20,‘mmm‘),
PARTITION p2 VALUES LESS THAN (15,30,‘sss‘)
)

分區鍵有多個, 並且都是範圍的, 就是RANGE COLUMNS 分區

2. LIST COLUMNS 分區

Mysql 5.6開始支持LIST COLUMNS分區, 可以開始使用多個列作為分區的鍵, 並且列的數據類型除了數字類型可以作為分區列; 你也可以使用字符串類型, DATE和DATETIME

還是看例子吧

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‘)
);

3. HASH分區

使用分區鍵去確保數據可以均勻的分布在一個預先確定數字的分區上, 在hash分區中, 無需顯式的指定分區

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(store_id)
PARTITIONS 4;

4. KEY分區

key分區類似hash分區, 接受0個或多個列名, key分區的哈希函數由MySQL服務器提供。NDB集群使用md5();使用其他存儲引擎的表,服務器采用自己的內部的哈希函數是基於相同的算法password()。

CREATE TABLE k1 (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(20)
)
PARTITION BY KEY()
PARTITIONS 2;

5. 子分區

子分區也稱為復合分區, 在分區的基礎上進一步進行分區的方式

CREATE TABLE ts (
id INT, purchased DATE
)
PARTITION BY RANGE( YEAR(purchased) )
SUBPARTITION BY HASH( TO_DAYS(purchased) )
SUBPARTITIONS 2 (
    PARTITION p0 VALUES LESS THAN (1990),
    PARTITION p1 VALUES LESS THAN (2000),
    PARTITION p2 VALUES LESS THAN MAXVALUE
);

Mysql 分區介紹(一) ——概述