MySQL支持數據分區,能夠在對用戶無感知的狀況下,將對錶數據的物理文件進行分區。算法
MySQL的分區支持Memory、MyISAM、InnoDB等存儲引擎。sql
注意:MySQL中若是存在主鍵,或者惟一索引,那麼分區字段必須包含這些字段。函數
一、分區後的文件能夠存儲在不一樣的分區,提升MySQL存儲量spa
二、根據查詢條件能夠有選擇之掃描某個分區,使用sum等聚合函數的時候能夠並行檢索全部分區。日誌
三、經過必定規則的分區,能夠快速刪除分區內的數據,好比存儲日誌按月分區能夠快速刪除歷史日誌。code
四、經過將分區保存在不一樣的硬盤之上,來提高系統的IO吞吐量。索引
檢查MySQL版本是否支持分區ci
//查看錶分區狀態 查看 have_parttition_engine 是否爲YES SHOW VARIABLES LIKE '%parttition%';
檢測SQL查詢掃描了哪一個分區hash
//檢查SQL語句使用了哪一個分區分區 explain partitions SQL;
目前MySQL支持 range、list、columns、hash、key等幾種分區方式。it
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方式的分區,跟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方式算是對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 )
經過對分區key表達式取模的方式,對數據進行均勻的分區。
//id進行hash運算後分紅4個分區 PARTITION BY HASH(id) PARTITIONS 4;
可是這種方式太不靈活了,擴展性很是差,不利於之後分區的擴展,因此MySQL提供另一種線形Hash。
PARTITION BY LINEAR HASH(id) PARTTITIONS 8;
經過線形hash分區後的數據,在擴容的時候若是分區數爲2的N次冪,那麼計算的結果於普通hash相同,這樣避免了往後擴容的數據遷移,可是也致使數據不均的問題。
於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 ( ... )
分區方式 | 處理方式 |
---|---|
Hash | 做爲0值 |
Key | 做爲0值 |
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兩種分區類型不容許直接刪除某個分區,可是能夠將分區進行合併。
//修改分區個數爲2 併合並數據 ALTER TABLE `表名` COALESCE PARTITION PARTITION 2;
COALESCE只能夠減小分區個數不能夠增長分區個數。
//增長分區個數 增長6個分區 ALTER TABLE `表名` ADD PARTITION PARTITIONS 6;
能夠經過以上方式,增長指定數量的分區。