9、MySQL的分區 - 系統的擼一遍MySQL

MySQL支持數據分區,能夠在對用戶無感知的狀況下,將對錶數據的物理文件進行分區。算法

MySQL的分區支持Memory、MyISAM、InnoDB等存儲引擎。sql

注意:MySQL中若是存在主鍵,或者惟一索引,那麼分區字段必須包含這些字段。函數

MySQL分區的優勢

一、分區後的文件能夠存儲在不一樣的分區,提升MySQL存儲量spa

二、根據查詢條件能夠有選擇之掃描某個分區,使用sum等聚合函數的時候能夠並行檢索全部分區。日誌

三、經過必定規則的分區,能夠快速刪除分區內的數據,好比存儲日誌按月分區能夠快速刪除歷史日誌。code

四、經過將分區保存在不一樣的硬盤之上,來提高系統的IO吞吐量。索引

分區相關的命令

檢查MySQL版本是否支持分區ci

//查看錶分區狀態 查看 have_parttition_engine 是否爲YES
SHOW VARIABLES LIKE '%parttition%';

檢測SQL查詢掃描了哪一個分區hash

//檢查SQL語句使用了哪一個分區分區
explain partitions SQL;

MySQL的分區方式

目前MySQL支持 range、list、columns、hash、key等幾種分區方式。it

Range方式

Range方式的分區,能夠選擇指定字段根據連續的區間進行分區,好比:

小於20的分區爲 p0,20-40的叫作p1 40-60的叫作p2,大於60的叫作p3,在MySQL中的表示爲:

注意:Range方式定義每個分區區間,好比按從小到大的順序來定義。

PARTITION BY RANGE(sum) (
    PARTITION p0 VALUES LESS THAN (20),
    PARTITION p1 VALUES LESS THAN (40),
    PARTITION p2 VALUES LESS THAN (60),
    PARTITION p3 VALUES LESS THAN MAXVALUE
)

其中 sum 字段能夠進行表達式運算。好比加入上面分區key爲create time能夠經過YEAR(createtime)來進行運算。

LIST方式

LIST方式的分區,跟Range方式相似,不一樣的是,LIST方式非連續區間,而是一個枚舉列表的集合。

只有存在於這個枚舉列表集合內的數據才能夠被插入,不然不能夠寫入。

PARTITION BY LIST(type) (
    PARTITION p0 VALUES IN (1,2,3),
    PARTITION p1 VALUES IN (4,5,6),
    PARTITION p2 VALUES IN (7,8,9)
)

Columns方式

Columns方式算是對Range和LIST方式的一個補充,由於Range和LIST僅僅支持整數字段分區,因此經過Columns方式能夠實現非整數分區,目前支持如下類型:整型、date、datetime、char、varchar、binary、varbinary等類型。

Columns方式不能夠在定義分區key的時候進行表達式運算,可是能夠定義多個分區key。

PARTITION BY RANGE COLUMNS(sum, avg) (
    PARTITION p0 VALUES LESS THAN (20, 5),
    PARTITION p1 VALUES LESS THAN (40, 10),
    PARTITION p2 VALUES LESS THAN (60, 15),
    PARTITION p3 VALUES LESS THAN MAXVALUE
)

Hash分區

經過對分區key表達式取模的方式,對數據進行均勻的分區。

//id進行hash運算後分紅4個分區
PARTITION BY HASH(id) PARTITIONS 4;

可是這種方式太不靈活了,擴展性很是差,不利於之後分區的擴展,因此MySQL提供另一種線形Hash。

PARTITION BY LINEAR HASH(id) PARTTITIONS 8;

 經過線形hash分區後的數據,在擴容的時候若是分區數爲2的N次冪,那麼計算的結果於普通hash相同,這樣避免了往後擴容的數據遷移,可是也致使數據不均的問題。

Key分區

於Hash分區很相似,區別在於只支持數字,而且定義分區字段的時候不容許使用表達式,可是能夠提供多個分區字段。

另外Hash分區採用MOD的方式進行計算,Key分區採用MySQL內部的Hash算法進行計算。

Key分區在存在主鍵或惟一索引時候能夠不指定分區字段,不指定的狀況會默認使用主鍵或惟一索引。

//根據id進行分區,並劃分四個分區
PARTITION BY KEY(id) PARTITIONS 4;

複合分區

MySQL容許對Range和List分區後的每一個分區再次進行Hash或Key分區操做。

PARTITION BY LIST(type)
SUBPARTITION BY KEY(id)
SUBPARTTIONS 4
(
    ...
)

分區字段中的NULL

分區方式 處理方式
Hash 做爲0值
Key 做爲0值
Range 做爲最小值
List 必須包含在枚舉列表

分區的管理

Range、List

//刪除某個分區
ALTER TABLE `表名` DROP PARTITION `分區名`;
//增長分區
ALTER TABLE `表名` ADD PARTITION (PARTITION p0 VALUES LESS THAN (10));
//修改分區 並自動遷移數據
ALTER TABLE `表名` REORGANIZE PARTITION INTO `一個或分區名`(更新後的分區)

Range修改分區的時候,修改多個分區必須爲連續的分區不能夠跳躍的修改。

List分區修改或增長的時候,不容許插入枚舉列表中已經存在的值。

Hash、Key

Hash和Key兩種分區類型不容許直接刪除某個分區,可是能夠將分區進行合併。

//修改分區個數爲2 併合並數據
ALTER TABLE `表名` COALESCE PARTITION PARTITION 2;

COALESCE只能夠減小分區個數不能夠增長分區個數。

//增長分區個數 增長6個分區
ALTER TABLE `表名` ADD PARTITION PARTITIONS 6;

能夠經過以上方式,增長指定數量的分區。

相關文章
相關標籤/搜索