Mysql 分區(qū)

??以mysql為例惹苗。mysql數據庫中的數據是以文件的形勢存在磁盤上的殿较,默認放在/mysql/data下面(可以通過my.cnf中的datadir來查看),一張表主要對應著三個文件桩蓉,一個是frm存放表結構的淋纲,一個是myd存放表數據的,一個是myi存表索引的触机。如果一張表的數據量太大的話帚戳,那么myd,myi就會變的很大,查找數據就會變的很慢儡首,這個時候我們可以利用mysql的分區(qū)功能片任,在物理上將這一張表對應的三個文件,分割成許多個小塊蔬胯,這樣呢对供,我們查找一條數據時,就不用全部查找了氛濒,只要知道這條數據在哪一塊产场,然后在那一塊找就行了。如果表的數據太大舞竿,可能一個磁盤放不下京景,這個時候,我們可以把數據分配到不同的磁盤里面去骗奖。


數據庫分區(qū)

  1. 橫向(水平)分區(qū)

什么是橫向分區(qū)呢确徙?就是橫著來分區(qū)了醒串,舉例來說明一下,假如有100W條數據鄙皇,分成十份芜赌,前10W條數據放到第一個分區(qū),第二個10W條數據放到第二個分區(qū)伴逸,依此類推缠沈。也就是把表分成了十分,根用merge來分表错蝴,有點像哦洲愤。取出一條數據的時候,這條數據包含了表結構中的所有字段漱竖,也就是說橫向分區(qū)禽篱,并沒有改變表的結構畜伐。

  1. 縱向(垂直)分區(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ū)
  1. RANGE 分區(qū)重建
    ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 VALUES LESS THAN (6000000));
  2. LIST 分區(qū)重建
    ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 VALUES IN(0,1,4,5,8,9,12,13));
  3. HASH/KEY 分區(qū)重建
    ALTER TABLE users REORGANIZE PARTITION COALESCE PARTITION 2;
  • 新增分區(qū)
  1. 新增 RANGE 分區(qū)
ALTER TABLE category ADD PARTITION (
    PARTITION p4 VALUES IN (16,17,18,19)
    DATA DIRECTORY = '/data8/data'
    INDEX DIRECTORY = '/data9/idx');
  1. 新增 HASH/KEY 分區(qū)
    ALTER TABLE users ADD PARTITION PARTITIONS 8;

  2. 給已有的表加上分區(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)點

  1. 分區(qū)可以分在多個磁盤浩习,存儲更大一點
  2. 根據查找條件,也就是where后面的條件掘托,查找只查找相應的分區(qū)不用全部查找了
  3. 進行大數據搜索時可以進行并行處理瘦锹。
  4. 跨多個磁盤來分散數據查詢,來獲得更大的查詢吞吐量
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末闪盔,一起剝皮案震驚了整個濱河市弯院,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泪掀,老刑警劉巖听绳,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異异赫,居然都是意外死亡椅挣,警方通過查閱死者的電腦和手機头岔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鼠证,“玉大人峡竣,你說我怎么就攤上這事×烤牛” “怎么了适掰?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長荠列。 經常有香客問我类浪,道長,這世上最難降的妖魔是什么肌似? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任费就,我火速辦了婚禮,結果婚禮上川队,老公的妹妹穿的比我還像新娘力细。我一直安慰自己,他們只是感情好呼寸,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布艳汽。 她就那樣靜靜地躺著猴贰,像睡著了一般对雪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上米绕,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天瑟捣,我揣著相機與錄音,去河邊找鬼栅干。 笑死迈套,一個胖子當著我的面吹牛,可吹牛的內容都是我干的碱鳞。 我是一名探鬼主播桑李,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窿给!你這毒婦竟也來了贵白?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤崩泡,失蹤者是張志新(化名)和其女友劉穎禁荒,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體角撞,經...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡呛伴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年勃痴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片热康。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡沛申,死狀恐怖,靈堂內的尸體忽然破棺而出姐军,到底是詐尸還是另有隱情污它,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布庶弃,位于F島的核電站衫贬,受9級特大地震影響,放射性物質發(fā)生泄漏歇攻。R本人自食惡果不足惜固惯,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缴守。 院中可真熱鬧葬毫,春花似錦、人聲如沸屡穗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽村砂。三九已至烂斋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間础废,已是汗流浹背汛骂。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留评腺,地道東北人帘瞭。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像蒿讥,于是被迫代替她去往敵國和親蝶念。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內容

  • 一芋绸,什么是數據庫分區(qū)前段時間寫過一篇關于mysql分表的的文章媒殉,下面來說一下什么是數據庫分區(qū),以mysql為例侥钳。m...
    MrKai平凡之路閱讀 1,169評論 0 5
  • mysql分區(qū) Mysql支持水平分區(qū)适袜,并不支持垂直分區(qū);水平分區(qū):指將同一表中不同行的記錄分配到不同的物理文件中...
    Gundy_閱讀 919評論 0 2
  • Mysql在創(chuàng)建表時使用partition by子句定義每個分區(qū)存放的數據,將數據安裝一個較粗的刻度分在不同的表中...
    liuwj的ing閱讀 605評論 0 2
  • 原文鏈接 http://blog.csdn.net/kobejayandy/article/details/547...
    lucode閱讀 906評論 0 0
  • 分區(qū)是指根據一定的規(guī)則舷夺,數據庫把一個表分解成多個更小的苦酱,更容易管理的部分售貌。就訪問數據庫的應用而言,邏輯上只有一個表...
    微日月閱讀 1,504評論 0 7