MySQL数据库:分区Partition
一、分區:
分區就是將表的數據按照特定規則存放在不同的區域,也就是將表的數據文件分割成多個小塊,在查詢數據的時候,只要知道數據數據存儲在哪些區域,然后直接在對應的區域進行查詢,不需要對表數據進行全部的查詢,提高查詢的性能。同時,如果表數據特別大,一個磁盤磁盤放不下時,我們也可以將數據分配到不同的磁盤去,解決存儲瓶頸的問題,利用多個磁盤,也能夠提高磁盤的IO效率,提高數據庫的性能。常見的分區類型有:Range分區、List分區、Hash分區、Key分區:
- (1)Range分區:按照連續的區間范圍進行分區
- (2)List分區:按照給定的集合中的值進行選擇分區。
- (3)Hash分區:基于用戶定義的表達式的返回值進行分區,該表達式使用將要插入到表中的這些行的列值進行計算。這個函數可以包含MySQL中有效的、產生非負整數值的任何表達式。
- (4)Key分區:類似于按照HASH分區,區別在于Key分區只支持計算一列或多列,且key分區的哈希函數是由 MySQL 服務器提供。
1、表分區的優點:
(1)可伸縮性:
- 將分區分在不同磁盤,可以解決單磁盤容量瓶頸問題,存儲更多的數據,也能解決單磁盤的IO瓶頸問題。
(2)提升數據庫的性能:
- 減少數據庫檢索時需要遍歷的數據量,在查詢時只需要在數據對應的分區進行查詢。
- 避免Innodb的單個索引的互斥訪問限制
- 對于聚合函數,例如sum()和count(),可以在每個分區進行并行處理,最終只需要統計所有分區得到的結果
(3)方便對數據進行運維管理:
- 方便管理,對于失去保存意義的數據,通過刪除對應的分區,達到快速刪除的作用。比如刪除某一時間的歷史數據,直接執行truncate,或者直接drop整個分區,這比detele刪除效率更高;
- 在某些場景下,單個分區表的備份很恢復會更有效率。
2、表分區的缺陷:
(1)分區字段必須放主鍵或者唯一索引中;
(2)每個表最大分區數為1024;
3、業務場景舉例:
(1)項目需要動態新建、刪除分區。比如新聞表,按照時月份進行分區,同時為了防止新聞表過大,只保留最近6個月的分區,同時預建后面3個月的分區,這個刪除、預建分區的過程就是分區表的動態管理。
(2)歷史數據或不常訪問的數據占很大部分,最新或熱點數據占的比例不是很大,這時也可以進行表分區。
4、MySQL分區類型:
根據所使用的不同分區規則,可以分成幾大分區類型:??
| 序號 | 分區類型 | 說明 | 使用頻率 |
| 1 | RANGE 分區 | 按照連續的區間范圍進行分區 | 較多 |
| 2 | LIST 分區 | 按照給定的集合中的值進行選擇分區 | 一般 |
| 3 | HASH 分區 | 基于用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。這個函數可以包含MySQL中有效的、產生非負整數值的任何表達式。 | 較多 |
| 4 | KEY 分區 | 類似于按照HASH分區,除了區別在于KEY分區只支持計算一列或多列,且KEY分區的哈希函數是由MySQL 服務器提供。 | 一般 |
(1)range分區:
每個分區的值位于一個給定的連續區間內之內。
PARTITION BY RANGE (id) ( ?
? ? ? ? ?PARTITION p0 VALUES LESS THAN (3), ?
? ? ? ? ?PARTITION p1 VALUES LESS THAN (6), ?
? ? ? ? ?PARTITION p2 VALUES LESS THAN (9), ?
? ? ? ? ?PARTITION p3 VALUES LESS THAN (12), ?
? ? ? ? ?PARTITION p4 VALUES LESS THAN MAXVALUE ?
); ?
(2)List分區:
類似于按RANGE分區,區別在于LIST分區是基于列值匹配一個離散值集合中的某個值來進行選擇。
PARTITION BY LIST (province_id) ( ?
? ? ? ? ?PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8), ?
? ? ? ? ?PARTITION p1 VALUES IN (9,10,11,12,16,21), ?
? ? ? ? ?PARTITION p2 VALUES IN (13,14,15,19), ?
? ? ? ? ?PARTITION p3 VALUES IN (17,18,20,22,23,24) ?
?);
?(3)Hash分區:
基于用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。這個函數可以包含MySQL中有效的、產生非負整數值的任何表達式。?
HASH分區主要用來確保數據在預先確定數目的分區中平均分布。在RANGE和LIST分區中,必須明確指定一個給定的列值或列值集合應該保存在哪個分區中。?
create table foo_hash
(empno varchar(20) not null ,
empname varchar(20),
deptno int,
birthdate date not null,
salary int
)
partition by hash(year(birthdate))
partitions 4;
以上創建了4個分區。
(4)Key分區:
類似于按HASH分區,區別在于KEY分區只支持計算一列或多列,且MySQL服務器提供其自身的哈希函數。必須有一列或多列包含整數值。
create table foo_key
(empno varchar(20) not null ,
empname varchar(20),
deptno int,
birthdate date not null,
salary int
)
partition by key(birthdate)
partitions 4;
(5)復合分區:
子分區是針對 RANGE/LIST 類型的分區表中每個分區的再次分割。子分區可以是 HASH/KEY 等類型。
PARTITION BY RANGE (uid) SUBPARTITION BY HASH (uid % 4) SUBPARTITIONS 2(
?????PARTITION p0 VALUES LESS THAN (3000000)
?????DATA DIRECTORY = '/data0/data'
?????INDEX DIRECTORY = '/data1/idx',
?????PARTITION p1 VALUES LESS THAN (6000000)
?????DATA DIRECTORY = '/data2/data'
?????INDEX DIRECTORY = '/data3/idx'
);
以上例子,對 RANGE 分區再次進行子分區劃分,子分區采用 HASH 類型。
?
二、常見分區操作:
?
總結
以上是生活随笔為你收集整理的MySQL数据库:分区Partition的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL数据库:drop、trunca
- 下一篇: MySQL数据库:读写分离