MySql表分區——partition

1、分區的優勢

  • 和單個磁盤或文件系統分區相比,能夠存儲更多的數據。
  • 優化查詢。mysql

    • where 子句中包含分區條件時,能夠只掃描必要的分區。
    • 涉及聚合函數的查詢時,能夠容易的在每一個分區上並行處理,最終只需彙總獲得結果。
  • 對於已通過期或者不須要保存的數據,能夠經過刪除與這些數據有關的分區來快速刪除數據。
  • 跨多個磁盤來分散數據查詢,以得到更大的查詢吞吐量。

2、分區方法

將某張表的數據,分別存儲到不一樣的區域中。每一個分區都是獨立的表,都要存儲該分區數據的數據、索引等信息。
使用mysql的分區功能,能夠把一個大的數據表分紅多個小份,用戶不須要區分不一樣的表名。
表中有主鍵的時候,分區只能使用主鍵算法

1. KEY 分區,按照某個字段取餘
create table post (
    id int unsigned not null AUTO_INCREMENT,
    title varchar(255),
    PRIMARY KEY (id)
) engine = innodb
partition by key (id) partitions 5;
2. HASH 分區,基於給定的分區個數,把數據分配到不一樣的分區。
create table student_hash(
    id int unsigned not null auto_increment,
    birthday date,
    PRIMARY KEY(id,birthday);
) engine=myisam
partition by hash (month(birthday)) patitions 12;

key 和 hash 分區方法能夠有效的分散熱點數據。sql

3. RANGE 分區,基於一個給定連續區間範圍,把數據分配到不一樣的分區
create table goods (
 id int,
 uname char(10)
 )engine myisam
 partition by range(id) (
 partition p1 values less than (10),
 partition p2 values less than (20),
 partition p3 values less than MAXVALUE
 );
4.LIST 分區,相似 RANGE 分區,區別在 LIST 分區是基於枚舉出的值列表分區,RANGE 是局域給定的連續區間範圍分區。
create table user (
uid int,
pid int,
uname 
)engine myisam
partition by list(pid) (
partition bj values in (1),
partition ah values in (2),
partition xb values in (4,5,6)
);
# 若是試圖插入的列值不包含分區值列表中時,那麼 insert 操做會失敗並報錯,要重點注意的是,list 分區不存在相似 values less than maxvalue 這樣包含其餘值在內的定義方式,將要匹配的任何值都必須在值列表中找獲得。
5. Clumns 分區

是在mysql5.5引入的分區類型,解決了以前版本 range 和 list 分區只支持整數分區,從而致使須要額外的函數計算獲得整數或經過額外的轉換表來轉換爲整數再分區的問題。
Columns 分區能夠細分爲 range columns 分區和 list columns 分區,這兩種分區都支持整數,日期和字符串三大數據類型。
columns 分區的另外一個亮點是支持多列分區:less

mysql> create table rc3(
    a int,
    b int
)
partition by range columns(a,b)(
    partition p01 values less than (0,10),
    partition p02 values less than (10,10),
    partition p03 values less than (10,20),
    partition p04 values less than (10,35),
    partition p05 values less than (10,maxvalue),
    partition p06 values less than (maxvalue,maxvalue)
);
6. 子分區

子分區(subpartitioning)是分區表中對每一個分區的再次分割,又被稱爲符合分區(composite partitioning)。mysql 從 mysql 5.1 開始支持對已經經過 range 或者 list 分區了的表再進行子分區,子分區既可使用 hash 分區,也可使用 key 分區。函數

mysql> 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,
    );

表 ts 有3個 range 分區,這 3 個分區中的每一個分區又進一步分紅 2 個子分區,實際上,整個表被分紅了 3*2=6 個分區,因爲 partition by range 子句的做用,第一和第二個分區只保存 purchased 列中值小於 1990 的記錄。
複合分區適用於保存很是大量的數據記錄。post

3、分區管理

1. 取餘算法 key hash

採用取餘算法的分區數量的修改,不會致使已有分區數據的丟失,須要從新分配數據到新的分區
增長分區: add partition N;
減小分區:coalesce partition N;大數據

2. 條件算法 list range

添加分區優化

alert table goods add partition(
partition p4 values less than 40);

刪除分區ui

alert table goods drop partition p1;
注意:刪除條件算法的分區,會致使分區數據的丟失

4、mysql 分區處理 null 值的方式

mysql 不由止在分區鍵值上使用 null , 分區鍵多是一個字段或者一個用戶定義的額表達式。通常狀況下,mysql 的分區把 null 看成零值,或者一個最小值進行處理。
range 分區中,null 值會被看成最小值來處理;
list 分區中,null 值必須出如今枚舉列表中,不然不被接受;
hash/key 分區中,null 值會被看成零值來處理。code

相關文章
相關標籤/搜索