??以mysql為例惹苗。mysql數據庫中的數據是以文件的形勢存在磁盤上的殿较,默認放在/mysql/data下面(可以通過my.cnf中的datadir來查看),一張表主要對應著三個文件桩蓉,一個是frm存放表結構的淋纲,一個是myd存放表數據的,一個是myi存表索引的触机。如果一張表的數據量太大的話帚戳,那么myd,myi就會變的很大,查找數據就會變的很慢儡首,這個時候我們可以利用mysql的分區(qū)功能片任,在物理上將這一張表對應的三個文件,分割成許多個小塊蔬胯,這樣呢对供,我們查找一條數據時,就不用全部查找了氛濒,只要知道這條數據在哪一塊产场,然后在那一塊找就行了。如果表的數據太大舞竿,可能一個磁盤放不下京景,這個時候,我們可以把數據分配到不同的磁盤里面去骗奖。
數據庫分區(qū)
- 橫向(水平)分區(qū)
什么是橫向分區(qū)呢确徙?就是橫著來分區(qū)了醒串,舉例來說明一下,假如有100W條數據鄙皇,分成十份芜赌,前10W條數據放到第一個分區(qū),第二個10W條數據放到第二個分區(qū)伴逸,依此類推缠沈。也就是把表分成了十分,根用merge來分表错蝴,有點像哦洲愤。取出一條數據的時候,這條數據包含了表結構中的所有字段漱竖,也就是說橫向分區(qū)禽篱,并沒有改變表的結構畜伐。
- 縱向(垂直)分區(qū)
什么是縱向分區(qū)呢馍惹?就是豎來分區(qū)了,舉例來說明玛界,在設計用戶表的時候万矾,開始的時候沒有考慮好,而把個人的所有信息都放到了一張表里面去慎框,這樣這個表里面就會有比較大的字段良狈,如個人簡介,而這些簡介呢笨枯,也許不會有好多人去看薪丁,所以等到有人要看的時候,在去查找馅精,分表的時候严嗜,可以把這樣的大字段,分開來洲敢。
水平分區(qū)(根據列屬性按行分)
Range(范圍) – 這種模式允許DBA將數據劃分不同范圍漫玄。例如DBA可以將一個表通過年份劃分成三個分區(qū),80年代(1980's)的數據压彭,90年代(1990's)的數據以及任何在2000年(包括2000年)后的數據睦优。
Hash(哈希) – 這中模式允許DBA通過對表的一個或多個列的Hash Key進行計算,最后通過這個Hash碼不同數值對應的數據區(qū)域進行分區(qū)壮不,汗盘。例如DBA可以建立一個對表主鍵進行分區(qū)的表。
Key(鍵值) – 上面Hash模式的一種延伸询一,這里的Hash Key是MySQL系統(tǒng)產生的隐孽。
List(預定義列表) – 這種模式允許系統(tǒng)通過DBA定義的列表的值所對應的行數據進行分割尸执。例如:DBA建立了一個橫跨三個分區(qū)的表,分別根據2004年2005年和2006年值所對應的數據缓醋。
Composite(復合模式) - 很神秘吧如失,哈哈,其實是以上模式的組合使用而已送粱,就不解釋了褪贵。舉例:在初始化已經進行了Range范圍分區(qū)的表上,我們可以對其中一個分區(qū)再進行hash哈希分區(qū)抗俄。
垂直分區(qū)(按列分)
例子:一個包含了大text和BLOB列的表脆丁,這些text和BLOB列又不經常被訪問,這時候就要把這些不經常使用的text和BLOB了劃分到另一個分區(qū)动雹,在保證它們數據相關性的同時還能提高訪問速度槽卫。
查看支持
mysql> show variables like "%part%";
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| have_partitioning | YES |
+-------------------+-------+
1 row in set (0.00 sec)
分區(qū)命令詳解
- RANGE 類型
CREATE TABLE users (
uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL DEFAULT '',
email VARCHAR(30) NOT NULL DEFAULT ''
)
PARTITION BY RANGE (uid) (
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',
PARTITION p2 VALUES LESS THAN (9000000)
DATA DIRECTORY = '/data4/data'
INDEX DIRECTORY = '/data5/idx',
PARTITION p3 VALUES LESS THAN MAXVALUE
DATA DIRECTORY = '/data6/data'
INDEX DIRECTORY = '/data7/idx'
);
在這里,將用戶表分成4個分區(qū)胰蝠,以每300萬條記錄為界限歼培,每個分區(qū)都有自己獨立的數據、索引文件的存放目錄茸塞,與此同時躲庄,這些目錄所在的物理磁盤分區(qū)可能也都是完全獨立的,可以提高磁盤IO吞吐量钾虐。
- LIST 類型
CREATE TABLE category (
cid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL DEFAULT ''
)
PARTITION BY LIST (cid) (
PARTITION p0 VALUES IN (0,4,8,12)
DATA DIRECTORY = '/data0/data'
INDEX DIRECTORY = '/data1/idx',
PARTITION p1 VALUES IN (1,5,9,13)
DATA DIRECTORY = '/data2/data'
INDEX DIRECTORY = '/data3/idx',
PARTITION p2 VALUES IN (2,6,10,14)
DATA DIRECTORY = '/data4/data'
INDEX DIRECTORY = '/data5/idx',
PARTITION p3 VALUES IN (3,7,11,15)
DATA DIRECTORY = '/data6/data'
INDEX DIRECTORY = '/data7/idx'
);
- HASH 類型
CREATE TABLE users (
uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL DEFAULT '',
email VARCHAR(30) NOT NULL DEFAULT ''
)
PARTITION BY HASH (uid) PARTITIONS 4 (
PARTITION p0
DATA DIRECTORY = '/data0/data'
INDEX DIRECTORY = '/data1/idx',
PARTITION p1
DATA DIRECTORY = '/data2/data'
INDEX DIRECTORY = '/data3/idx',
PARTITION p2
DATA DIRECTORY = '/data4/data'
INDEX DIRECTORY = '/data5/idx',
PARTITION p3
DATA DIRECTORY = '/data6/data'
INDEX DIRECTORY = '/data7/idx'
);
- KEY 類型
CREATE TABLE users (
uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL DEFAULT '',
email VARCHAR(30) NOT NULL DEFAULT ''
)
PARTITION BY KEY (uid) PARTITIONS 4 (
PARTITION p0
DATA DIRECTORY = '/data0/data'
INDEX DIRECTORY = '/data1/idx',
PARTITION p1
DATA DIRECTORY = '/data2/data'
INDEX DIRECTORY = '/data3/idx',
PARTITION p2
DATA DIRECTORY = '/data4/data'
INDEX DIRECTORY = '/data5/idx',
PARTITION p3
DATA DIRECTORY = '/data6/data'
INDEX DIRECTORY = '/data7/idx'
);
- 子分區(qū)
子分區(qū)是針對 RANGE/LIST 類型的分區(qū)表中每個分區(qū)的再次分割噪窘。再次分割可以是 HASH/KEY 等類型。
CREATE TABLE users (
uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL DEFAULT '',
email VARCHAR(30) NOT NULL DEFAULT ''
)
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 分區(qū)再次進行子分區(qū)劃分效扫,子分區(qū)采用 HASH 類型倔监。
CREATE TABLE users (
uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL DEFAULT '',
email VARCHAR(30) NOT NULL DEFAULT ''
)
PARTITION BY RANGE (uid) SUBPARTITION BY KEY(uid) 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 分區(qū)再次進行子分區(qū)劃分,子分區(qū)采用 KEY 類型菌仁。
分區(qū)管理
- 刪除分區(qū)
ALERT TABLE users DROP PARTITION p0;
- 重建分區(qū)
- RANGE 分區(qū)重建
ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 VALUES LESS THAN (6000000));
- LIST 分區(qū)重建
ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 VALUES IN(0,1,4,5,8,9,12,13));
- HASH/KEY 分區(qū)重建
ALTER TABLE users REORGANIZE PARTITION COALESCE PARTITION 2;
- 新增分區(qū)
- 新增 RANGE 分區(qū)
ALTER TABLE category ADD PARTITION (
PARTITION p4 VALUES IN (16,17,18,19)
DATA DIRECTORY = '/data8/data'
INDEX DIRECTORY = '/data9/idx');
新增 HASH/KEY 分區(qū)
ALTER TABLE users ADD PARTITION PARTITIONS 8;
給已有的表加上分區(qū)
alter table results partition by RANGE (month(ttime))
(PARTITION p0 VALUES LESS THAN (1),
PARTITION p1 VALUES LESS THAN (2) ,
PARTITION p2 VALUES LESS THAN (3) ,
PARTITION p3 VALUES LESS THAN (4) ,
PARTITION p4 VALUES LESS THAN (5) ,
PARTITION p5 VALUES LESS THAN (6) ,
PARTITION p6 VALUES LESS THAN (7) ,
PARTITION p7 VALUES LESS THAN (8) ,
PARTITION p8 VALUES LESS THAN (9) ,
PARTITION p9 VALUES LESS THAN (10) ,
PARTITION p10 VALUES LESS THAN (11),
PARTITION p11 VALUES LESS THAN (12),
PARTITION P12 VALUES LESS THAN (13) );
分區(qū)優(yōu)點
- 分區(qū)可以分在多個磁盤浩习,存儲更大一點
- 根據查找條件,也就是where后面的條件掘托,查找只查找相應的分區(qū)不用全部查找了
- 進行大數據搜索時可以進行并行處理瘦锹。
- 跨多個磁盤來分散數據查詢,來獲得更大的查詢吞吐量