(018)mysql中的分區(qū)(開發(fā)篇完)

概述

之前殃饿,看到分區(qū),我捏個(gè)去芋肠,好高大上喲乎芳。昨天終于知道了分區(qū)是個(gè)啥玩意,也不過如此帖池,今天總結(jié)一下奈惑,好記性不如爛筆頭嘛。
??MySQL從5.1開始支持分區(qū)功能睡汹。分區(qū)一句話就是:把一張表按照某種規(guī)則(range/list/hash/key等)分成多個(gè)區(qū)域(頁/文件)保存肴甸。對(duì)mysql應(yīng)用開發(fā)來說,分區(qū)與不分區(qū)是沒區(qū)別的(即對(duì)應(yīng)用是透明的)囚巴。如同突圍戰(zhàn)中的“化整為零”原在。MySQL支持大部分的存儲(chǔ)引擎(如:MyISAM、InnoDB彤叉、Memory等)創(chuàng)建分區(qū)庶柿,不支持MERGE和CSV來創(chuàng)建分區(qū)。同一個(gè)分區(qū)表中的所有分區(qū)必須是同一個(gè)存儲(chǔ)引擎秽浇。做一個(gè)引例:

#創(chuàng)建一個(gè)5個(gè)hash分區(qū)的myisam表
CREATE TABLE `test`.`partition_t1`(  
  `id` INT UNSIGNED NOT NULL,
  `username` VARCHAR(30) NOT NULL,
  `email` VARCHAR(30) NOT NULL,
  `birth_date` DATE NOT NULL
) ENGINE=MYISAM
PARTITION BY HASH(MONTH(birth_date))
PARTITIONS 5;
引例結(jié)果

分區(qū)作用

  • 可以存儲(chǔ)更多的數(shù)據(jù)(系統(tǒng)單個(gè)文件最大限制)
  • 優(yōu)化查詢浮庐,在where子句中,如果包含分區(qū)條件柬焕,只需要掃描一個(gè)或部分分區(qū)來提高查詢效率审残。在涉及sum()這類函數(shù)時(shí)候, 可以在分區(qū)上并行處理斑举,最后匯總結(jié)果搅轿。
  • 對(duì)于過期或不需要的數(shù)據(jù),可以刪除相關(guān)分區(qū)來快速刪除數(shù)據(jù)富玷。
  • 跨多個(gè)磁盤來分散數(shù)據(jù)查詢璧坟,單表的并發(fā)能力提高了没宾,磁盤I/O性能也提高了。

分區(qū)類型

分為4種:

  • range分區(qū):基于一個(gè)給定的連續(xù)區(qū)間范圍沸柔,把數(shù)據(jù)分配到不同的分區(qū)中。
  • list分區(qū):類似range分區(qū)铲敛,區(qū)別在于list是基于枚舉出的值列表分區(qū)褐澎,range是根據(jù)范圍來分區(qū)的。
  • hash分區(qū):基于給定的分區(qū)個(gè)數(shù)伐蒋,把數(shù)據(jù)分配到不同分區(qū)(取模/線性)
  • key分區(qū):類似于hash分區(qū)工三。

MySQL5.1中range,list,hash分區(qū)要求分區(qū)鍵必須是int。MySQL5.5及以上先鱼,支持非整型的range和list分區(qū)俭正,即:range columns 和 list columns。
注意:無論哪種分區(qū)焙畔,要么分區(qū)表上沒有主鍵/唯一鍵掸读,要么分區(qū)鍵必須有一個(gè)是主鍵/唯一鍵。

1.range分區(qū)

range分區(qū)是利用取值范圍(區(qū)間)劃分分區(qū)宏多,區(qū)間要連續(xù)并且不能互相重疊儿惫,使用values less than操作符進(jìn)行分區(qū)定義。

例一:

CREATE TABLE `test`.`partition_t2`(  
  `id` INT UNSIGNED NOT NULL,
  `username` VARCHAR(30) NOT NULL,
  `email` VARCHAR(30) NOT NULL,
  `birth_date` DATE NOT NULL
) ENGINE=MYISAM
PARTITION BY RANGE(id)(
   PARTITION t21 VALUES LESS THAN (10),
   PARTITION t22 VALUES LESS THAN (20),
   PARTITION t23 VALUES LESS THAN MAXVALUE
);

上例中定義了一個(gè)包含3個(gè)分區(qū)(t21,t22,t23)的range分區(qū)表伸但,這個(gè)有點(diǎn)類似與高級(jí)語言中的switch語句肾请。解釋如下:當(dāng)id<10的時(shí)候,在t21分區(qū)更胖;當(dāng)20>id>=10的時(shí)候铛铁,在t22分區(qū);當(dāng)id>=20時(shí)候却妨,在t23分區(qū)饵逐。

例二:

CREATE TABLE `test`.`partition_t3`(  
  `id` INT UNSIGNED NOT NULL,
  `username` VARCHAR(30) NOT NULL,
  `email` VARCHAR(30) NOT NULL,
  `birth_date` DATE NOT NULL
) ENGINE=MYISAM
PARTITION BY RANGE COLUMNS(birth_date)(
   PARTITION t31 VALUES LESS THAN ('1996-01-01'),
   PARTITION t32 VALUES LESS THAN ('2006-01-01'),
   PARTITION t33 VALUES LESS THAN ('2038-01-01')
);

MySQL5.5改進(jìn)range分區(qū),提供range columns分區(qū)支持非整數(shù)分區(qū)管呵。

2.list分區(qū)

list分區(qū)創(chuàng)建離散的值列表(類似mysql中的enum類型數(shù)據(jù))來劃分分區(qū)梳毙,使用values in操作符來分區(qū)。list分區(qū)不必要聲明任何特定的順序的捐下。list有很多方面類似于range账锹。

CREATE TABLE `test`.`partition_t4`(  
  `id` INT UNSIGNED NOT NULL,
  `username` VARCHAR(30) NOT NULL,
  `email` VARCHAR(30) NOT NULL,
  `birth_date` DATE NOT NULL
) ENGINE=MYISAM
PARTITION BY LIST(id)(
   PARTITION t41 VALUES IN (1,2),
   PARTITION t42 VALUES IN (3,6),
   PARTITION t43 VALUES IN (5,4),
   PARTITION t44 VALUES IN (7,8)
);

上面的例子是,當(dāng)id為1或2坷襟,在t41分區(qū)奸柬;當(dāng)id為3或6,在t42分區(qū)婴程,以此類推...

3.hash分區(qū)

hash分區(qū)主要用來分散熱點(diǎn)讀取廓奕,確保數(shù)據(jù)在預(yù)定確定個(gè)數(shù)分區(qū)中盡可能的平均分布。一個(gè)表執(zhí)行hash分區(qū),mysql會(huì)對(duì)分區(qū)鍵應(yīng)用一個(gè)散列函數(shù)桌粉,以此確定數(shù)據(jù)應(yīng)該放在n個(gè)分區(qū)中的哪一個(gè)分區(qū)蒸绩。hash分區(qū)支持兩種散列函數(shù)(分區(qū)方式):取模算法(默認(rèn)hash分區(qū)方式)線性的2的冪的運(yùn)算法則(liner hash 分區(qū))

常規(guī)hash分區(qū)

#頂部引例就是常規(guī)hash分區(qū)
  • mysql不推薦使用涉及多列的hash表達(dá)式铃肯。
  • 常規(guī)hash在分區(qū)管理上帶來的代價(jià)太大了患亿,不適合靈活變動(dòng)的分區(qū)的需求。參見:一致性哈希算法
  • 因?yàn)槌R?guī)hash分區(qū)在管理上的問題押逼,所有mysql引入線性hash分區(qū)步藕。

線性hash分區(qū)

CREATE TABLE `test`.`partition_t5`(  
  `id` INT UNSIGNED NOT NULL,
  `username` VARCHAR(30) NOT NULL,
  `email` VARCHAR(30) NOT NULL,
  `birth_date` DATE NOT NULL
) ENGINE=MYISAM
PARTITION BY LINEAR HASH(id)
PARTITIONS 5;

上例中,創(chuàng)建一個(gè)5個(gè)分區(qū)的線性hash分區(qū)挑格。

  • 線性hash分區(qū)優(yōu)點(diǎn):在分區(qū)維護(hù)上咙冗,mysql能夠處理更加迅速;
  • 線性hash分區(qū)缺點(diǎn):分區(qū)各個(gè)分區(qū)之間數(shù)據(jù)分布不太均衡漂彤。

4.key分區(qū)

  • hash分區(qū)允許用戶自定義的表達(dá)式雾消,而key分區(qū)不允許使用用戶自定義的表達(dá)式。
  • hash分區(qū)只支持整數(shù)分區(qū)显歧,key分區(qū)支持除了blob或text類型之外的其他數(shù)據(jù)類型分區(qū)仪或。
  • 與hash分區(qū)不同,創(chuàng)建key分區(qū)表的時(shí)候士骤,可以不指定分區(qū)鍵范删,默認(rèn)會(huì)選擇使用主鍵/唯一鍵作為分區(qū)鍵,沒有主鍵/唯一鍵,必須指定分區(qū)鍵拷肌。
CREATE TABLE `test`.`partition_t6`(  
  `id` INT UNSIGNED NOT NULL,
  `username` VARCHAR(30) NOT NULL,
  `email` VARCHAR(30) NOT NULL,
  `birth_date` DATE NOT NULL
) ENGINE=MYISAM
PARTITION BY LINEAR KEY(email)
PARTITIONS 5;

columns 與子分區(qū)

1.columns分區(qū)

columns 包括range columns與list columns 支持非整型的分區(qū)鍵到旦。columns分區(qū)支持多列分區(qū)

CREATE TABLE `test`.`partition_t7`(  
  `a` INT UNSIGNED NOT NULL,
  `b` INT UNSIGNED NOT NULL
)
PARTITION BY RANGE COLUMNS(a,b)(
    PARTITION p0 VALUES LESS THAN (0,10),
    PARTITION p1 VALUES LESS THAN (10,10),
    PARTITION p2 VALUES LESS THAN (10,20),
    PARTITION p3 VALUES LESS THAN (10,35),
    PARTITION p4 VALUES LESS THAN (10,MAXVALUE),
    PARTITION p5 VALUES LESS THAN (MAXVALUE,MAXVALUE)
);

判斷依據(jù):(a<10) or ((1=10) and (10<10))巨缘。

2.子分區(qū)

子分區(qū)是分區(qū)表中對(duì)每一個(gè)分區(qū)的再次分割添忘,又被稱為復(fù)合分區(qū)。MySQL從MySQL5.1開始支持對(duì)通過range和list的表再進(jìn)行子分區(qū)若锁,子分區(qū)即可以hash分區(qū)搁骑,也可以使用key分區(qū)。子分區(qū)適合保存非常大量的數(shù)據(jù)記錄又固。

CREATE TABLE partition_t8(id INT,purchased DATE)
PARTITION BY RANGE(YEAR(purchased))
SUBPARTITION BY HASH(TO_DAYS(purchased))
SUBPARTITIONS 2(
    PARTITION p0 VALUES LESS THAN (1990),
    PARTITION p1 VALUES LESS THAN (2000),
    PARTITION p2 VALUES LESS THAN MAXVALUE
);
mysql子分區(qū)

分區(qū)管理

MySQL5.1提供添加仲器、刪除、重定義仰冠、合并乏冀、拆分分區(qū)命令。

1.range或list分區(qū)

#刪除分區(qū)
alter table partition_t8 drop partition p2;
#添加一個(gè)分區(qū)
alter table partition_t8 add partition(
    partition p4 values less than (2030)
    )
#重定義一個(gè)分區(qū)
alter table partition_t8 reorganize partition p3 into(
    partition p2 values less than (2005),
    partition p3 values less than (2015)
);
  • 只能從range分區(qū)列表最大端增加分區(qū)洋只。
  • 增加list分區(qū)辆沦,不能添加一個(gè)包含現(xiàn)有分區(qū)值列表中的任意值分區(qū)昼捍,也就是說對(duì)一個(gè)固定的分區(qū)鍵值,必須指定并且只能指定一個(gè)唯一的分區(qū)肢扯。
  • 重新定義range分區(qū)妒茬,只能夠重新定義相鄰的分區(qū),同時(shí)重新定義的分區(qū)區(qū)間必須和原分區(qū)區(qū)間覆蓋相同的區(qū)間蔚晨。

2.hash或key分區(qū)

#減少分區(qū)數(shù),(如將分區(qū)數(shù)減少到2)
alter table partition_t8 coalesce partition 2;
#增加分區(qū)數(shù)(如:為分區(qū)數(shù)增加了8)
alter table partiton_t8 add partition partitions 8;
  • coalesce不能用來增加分區(qū)數(shù)量郊闯。

分表參考

mysql分表的3種方法
mysql —— 分表分區(qū)(1)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蛛株,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌育拨,老刑警劉巖谨履,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異熬丧,居然都是意外死亡笋粟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門析蝴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來害捕,“玉大人,你說我怎么就攤上這事闷畸〕⑴危” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵佑菩,是天一觀的道長(zhǎng)盾沫。 經(jīng)常有香客問我,道長(zhǎng)殿漠,這世上最難降的妖魔是什么赴精? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮绞幌,結(jié)果婚禮上蕾哟,老公的妹妹穿的比我還像新娘。我一直安慰自己莲蜘,他們只是感情好谭确,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著菇夸,像睡著了一般琼富。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庄新,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天鞠眉,我揣著相機(jī)與錄音薯鼠,去河邊找鬼匈挖。 笑死嗤栓,一個(gè)胖子當(dāng)著我的面吹牛知允,可吹牛的內(nèi)容都是我干的弥喉。 我是一名探鬼主播址遇,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼糖驴,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼声旺!你這毒婦竟也來了出嘹?” 一聲冷哼從身側(cè)響起唯咬,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤纱注,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后胆胰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狞贱,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年蜀涨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞎嬉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厚柳,死狀恐怖氧枣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情别垮,我是刑警寧澤便监,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站碳想,受9級(jí)特大地震影響茬贵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜移袍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一解藻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葡盗,春花似錦螟左、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喘先,卻和暖如春钳吟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窘拯。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工红且, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坝茎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓暇番,卻偏偏與公主長(zhǎng)得像嗤放,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子壁酬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容