MySQL数据库:分区Partition
一、分區(qū):
分區(qū)就是將表的數(shù)據(jù)按照特定規(guī)則存放在不同的區(qū)域,也就是將表的數(shù)據(jù)文件分割成多個(gè)小塊,在查詢數(shù)據(jù)的時(shí)候,只要知道數(shù)據(jù)數(shù)據(jù)存儲(chǔ)在哪些區(qū)域,然后直接在對(duì)應(yīng)的區(qū)域進(jìn)行查詢,不需要對(duì)表數(shù)據(jù)進(jìn)行全部的查詢,提高查詢的性能。同時(shí),如果表數(shù)據(jù)特別大,一個(gè)磁盤(pán)磁盤(pán)放不下時(shí),我們也可以將數(shù)據(jù)分配到不同的磁盤(pán)去,解決存儲(chǔ)瓶頸的問(wèn)題,利用多個(gè)磁盤(pán),也能夠提高磁盤(pán)的IO效率,提高數(shù)據(jù)庫(kù)的性能。常見(jiàn)的分區(qū)類型有:Range分區(qū)、List分區(qū)、Hash分區(qū)、Key分區(qū):
- (1)Range分區(qū):按照連續(xù)的區(qū)間范圍進(jìn)行分區(qū)
- (2)List分區(qū):按照給定的集合中的值進(jìn)行選擇分區(qū)。
- (3)Hash分區(qū):基于用戶定義的表達(dá)式的返回值進(jìn)行分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包含MySQL中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。
- (4)Key分區(qū):類似于按照HASH分區(qū),區(qū)別在于Key分區(qū)只支持計(jì)算一列或多列,且key分區(qū)的哈希函數(shù)是由 MySQL 服務(wù)器提供。
1、表分區(qū)的優(yōu)點(diǎn):
(1)可伸縮性:
- 將分區(qū)分在不同磁盤(pán),可以解決單磁盤(pán)容量瓶頸問(wèn)題,存儲(chǔ)更多的數(shù)據(jù),也能解決單磁盤(pán)的IO瓶頸問(wèn)題。
(2)提升數(shù)據(jù)庫(kù)的性能:
- 減少數(shù)據(jù)庫(kù)檢索時(shí)需要遍歷的數(shù)據(jù)量,在查詢時(shí)只需要在數(shù)據(jù)對(duì)應(yīng)的分區(qū)進(jìn)行查詢。
- 避免Innodb的單個(gè)索引的互斥訪問(wèn)限制
- 對(duì)于聚合函數(shù),例如sum()和count(),可以在每個(gè)分區(qū)進(jìn)行并行處理,最終只需要統(tǒng)計(jì)所有分區(qū)得到的結(jié)果
(3)方便對(duì)數(shù)據(jù)進(jìn)行運(yùn)維管理:
- 方便管理,對(duì)于失去保存意義的數(shù)據(jù),通過(guò)刪除對(duì)應(yīng)的分區(qū),達(dá)到快速刪除的作用。比如刪除某一時(shí)間的歷史數(shù)據(jù),直接執(zhí)行truncate,或者直接drop整個(gè)分區(qū),這比detele刪除效率更高;
- 在某些場(chǎng)景下,單個(gè)分區(qū)表的備份很恢復(fù)會(huì)更有效率。
2、表分區(qū)的缺陷:
(1)分區(qū)字段必須放主鍵或者唯一索引中;
(2)每個(gè)表最大分區(qū)數(shù)為1024;
3、業(yè)務(wù)場(chǎng)景舉例:
(1)項(xiàng)目需要?jiǎng)討B(tài)新建、刪除分區(qū)。比如新聞表,按照時(shí)月份進(jìn)行分區(qū),同時(shí)為了防止新聞表過(guò)大,只保留最近6個(gè)月的分區(qū),同時(shí)預(yù)建后面3個(gè)月的分區(qū),這個(gè)刪除、預(yù)建分區(qū)的過(guò)程就是分區(qū)表的動(dòng)態(tài)管理。
(2)歷史數(shù)據(jù)或不常訪問(wèn)的數(shù)據(jù)占很大部分,最新或熱點(diǎn)數(shù)據(jù)占的比例不是很大,這時(shí)也可以進(jìn)行表分區(qū)。
4、MySQL分區(qū)類型:
根據(jù)所使用的不同分區(qū)規(guī)則,可以分成幾大分區(qū)類型:??
| 序號(hào) | 分區(qū)類型 | 說(shuō)明 | 使用頻率 |
| 1 | RANGE 分區(qū) | 按照連續(xù)的區(qū)間范圍進(jìn)行分區(qū) | 較多 |
| 2 | LIST 分區(qū) | 按照給定的集合中的值進(jìn)行選擇分區(qū) | 一般 |
| 3 | HASH 分區(qū) | 基于用戶定義的表達(dá)式的返回值來(lái)進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包含MySQL中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。 | 較多 |
| 4 | KEY 分區(qū) | 類似于按照HASH分區(qū),除了區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且KEY分區(qū)的哈希函數(shù)是由MySQL 服務(wù)器提供。 | 一般 |
(1)range分區(qū):
每個(gè)分區(qū)的值位于一個(gè)給定的連續(xù)區(qū)間內(nèi)之內(nèi)。
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分區(qū):
類似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來(lái)進(jìn)行選擇。
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分區(qū):
基于用戶定義的表達(dá)式的返回值來(lái)進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包含MySQL中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。?
HASH分區(qū)主要用來(lái)確保數(shù)據(jù)在預(yù)先確定數(shù)目的分區(qū)中平均分布。在RANGE和LIST分區(qū)中,必須明確指定一個(gè)給定的列值或列值集合應(yīng)該保存在哪個(gè)分區(qū)中。?
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;
以上創(chuàng)建了4個(gè)分區(qū)。
(4)Key分區(qū):
類似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且MySQL服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含整數(shù)值。
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)復(fù)合分區(qū):
子分區(qū)是針對(duì) RANGE/LIST 類型的分區(qū)表中每個(gè)分區(qū)的再次分割。子分區(qū)可以是 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'
);
以上例子,對(duì) RANGE 分區(qū)再次進(jìn)行子分區(qū)劃分,子分區(qū)采用 HASH 類型。
?
二、常見(jiàn)分區(qū)操作:
?
總結(jié)
以上是生活随笔為你收集整理的MySQL数据库:分区Partition的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MySQL数据库:drop、trunca
- 下一篇: MySQL数据库:读写分离