MySQL分區(qū)

1扇售、分區(qū)概念

mysql數(shù)據(jù)庫中的數(shù)據(jù)是以文件的形勢存在磁盤上的,默認(rèn)放在/mysql/data下面(可以通過my.cnf中的datadir來查看)岛宦,一張表主要對應(yīng)著三個文件(8.0對應(yīng)兩個丽焊,往期版本三個)一個是frm存放表結(jié)構(gòu)的,一個是myd存放表數(shù)據(jù)的纬朝,一個是myi存表索引的(innodb同理)。

如果一張表的數(shù)據(jù)量太大的話骄呼,那么myd,myi就會變的很大共苛,查找數(shù)據(jù)就會變的很慢,這個時候我們可以利用mysql的分區(qū)功能蜓萄,在物理上將這一張表對應(yīng)的三個文件隅茎,分割成許多個小塊,這樣呢嫉沽,我們查找一條數(shù)據(jù)時辟犀,就不用全部查找了,只要知道這條數(shù)據(jù)在哪一塊耻蛇,然后在那一塊找就行了踪蹬。如果表的數(shù)據(jù)太大胞此,可能一個磁盤放不下臣咖,這個時候,我們可以把數(shù)據(jù)分配到不同的磁盤里面去漱牵。

表分區(qū)夺蛇,是指根據(jù)一定規(guī)則,將數(shù)據(jù)庫中的一張表分解成多個更小的酣胀,容易管理的部分刁赦。從邏輯上看隔节,只有一張表衔统,但是底層卻是由多個物理分區(qū)組成盹憎。

2仍律、分區(qū)優(yōu)點

  1. 與單個磁盤或文件系統(tǒng)分區(qū)相比强胰,可以存儲更多的數(shù)據(jù)嫁怀。
  2. 對于那些已經(jīng)失去保存意義的數(shù)據(jù)牵触,通巢菽龋可以通過刪除與那些數(shù)據(jù)有關(guān)的分區(qū)墩剖,很容易地刪除那些數(shù)據(jù)猴凹。相反地,在某些情況下岭皂,添加新數(shù)據(jù)的過程又可以通過為那些新數(shù)據(jù)專門增加一個新的分區(qū)郊霎,來很方便地實現(xiàn)。
  3. 一些查詢可以得到極大的優(yōu)化爷绘,這主要是借助于滿足一個給定WHERE語句的數(shù)據(jù)可以只保存在一個或多個分區(qū)內(nèi)书劝,這樣在查找時就不用查找其他剩余的分區(qū)进倍。因為分區(qū)可以在創(chuàng)建了分區(qū)表后進(jìn)行修改,所以在第一次配置分區(qū)方案時還不曾這么做時购对,可以重新組織數(shù)據(jù)背捌,來提高那些常用查詢的效率。
  4. 涉及到例如SUM()和COUNT()這樣聚合函數(shù)的查詢洞斯,可以很容易地進(jìn)行并行處理毡庆。這種查詢的一個簡單例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”烙如。通過“并行”么抗,這意味著該查詢可以在每個分區(qū)上同時進(jìn)行,最終結(jié)果只需通過總計所有分區(qū)得到的結(jié)果亚铁。
  5. 通過跨多個磁盤來分散數(shù)據(jù)查詢蝇刀,來獲得更大的查詢吞吐量。

3徘溢、分區(qū)限制

  1. 一個表最多只能有1024個分區(qū)吞琐。
  2. MySQL5.1中,分區(qū)表達(dá)式必須是整數(shù)然爆,或者返回整數(shù)的表達(dá)式站粟。在MySQL5.5中提供了非整數(shù)表達(dá)式分區(qū)的支持。
  3. 如果分區(qū)字段中有主鍵或者唯一索引的列曾雕,那么所有主鍵列和唯一索引列都必須包含進(jìn)來奴烙。即:分區(qū)字段要么不包含主鍵或者索引列,要么包含全部主鍵和索引列剖张。
  4. 分區(qū)表中無法使用外鍵約束切诀。
  5. MySQL的分區(qū)適用于一個表的所有數(shù)據(jù)和索引,不能只對表數(shù)據(jù)分區(qū)而不對索引分區(qū)搔弄,也不能只對索引分區(qū)而不對表分區(qū)幅虑,也不能只對表的一部分?jǐn)?shù)據(jù)分區(qū)。

4顾犹、分區(qū)類型

  1. RANGE分區(qū):基于屬于一個給定連續(xù)區(qū)間的列值倒庵,把多行分配給分區(qū)。
    range分區(qū)使用values less than 操作符來進(jìn)行定義蹦渣, 把連續(xù)且不相互重疊的字段分配給分區(qū)哄芜,命令如下。
create table emp(
  `no` varchar(20) not null,
  `name` varchar(20),
  deptno int,
  birthdate date,
  salary int
)
partition by range(salary) (
  partition p1 values less than(1000),
  partition p2 values less than(5000),
  partition p3 values less than(10000)
);

insert into emp values('001', 'shineyork', 10, '2019-10-10', 5000);
insert into emp values('002', 'keke', 20, '2019-10-10', 1500);
insert into emp values('004', 'n', 20, '2019-10-10', 1000);
insert into emp values('004', 'c', 20, '2019-10-10', 6000);

如上的方式就是把數(shù)據(jù)根據(jù)salary的value進(jìn)行劃分柬唯,區(qū)分到不同的表分區(qū)中认臊;而這其中partition by range的語法類似于“switch..case”的語法,如果salary小余5000就會在p1中...當(dāng)salary大于10000會報錯

mysql> insert into emp values('003', 'a', 10, '2019-10-10', 10500);
ERROR 1526 (HY000): Table has no partition for value 10500

這是因為10000不在分區(qū)范圍內(nèi)锄奢,解決這個問題的辦法就是在其后加入“partition p4 values less than maxvalue” 語法失晴,這樣所有大于10000的數(shù)據(jù)都會存在p4分區(qū)中

partition by range(salary) (
  partition p1 values less than(1000),
  partition p2 values less than(5000),
  partition p3 values less than(10000),
  partition p4 values less than maxvalue
)

查詢分區(qū)之后某一個區(qū)中的數(shù)據(jù)

select * from emp partition (p3);

在range中也可以使用MySQL的系統(tǒng)函數(shù)剧腻,比如根據(jù)年齡進(jìn)行區(qū)分

create table emp(
  `no` varchar(20) not null,
  `name` varchar(20),
  deptno int,
  birthdate date,
  salary int
)
partition by range(year(birthdate)) (
  partition p1 values less than(1990),
  partition p2 values less than(2000),
  partition p3 values less than(2010),
  partition p4 values less than maxvalue
)
  1. LIST分區(qū):類似于range分區(qū),區(qū)別在于list中的每個分區(qū)的定義和選擇基于某列的值從屬于一個集合涂屁,而range分區(qū)是屬于一個連續(xù)區(qū)間值得集合书在。
create table emp(
  `no` varchar(20) not null,
  `name` varchar(20),
  deptno int,
  birthdate date,
  salary int
)
partition by list(deptno) (
  partition p1 values in (10,20,30),
  partition p2 values in (1,2,3),
  partition p4 values in (4,40)
);

insert into emp values('001', 'shineyork', 1, '2019-10-10', 5000);
insert into emp values('002', 'keke', 20, '2019-10-10', 1500);
insert into emp values('003', 'a', 10, '2019-10-10', 10500);
insert into emp values('004', 'n', 40, '2019-10-10', 1000);
insert into emp values('005', 'c', 6, '2019-10-10', 6000);

mysql> insert into emp values('005', 'c', 6, '2019-10-10', 6000);
ERROR 1526 (HY000): Table has no partition for value 6
  1. HASH分區(qū):HASH分區(qū)是基于用戶定義的表達(dá)式的返回值來進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計算拆又。這個函數(shù)可以包含MySQL中有效的儒旬、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。
    HASH分區(qū)主要用來確保數(shù)據(jù)在預(yù)先確定數(shù)目的分區(qū)中平均分布帖族。 在RANGE和LIST分區(qū)中栈源,必須明確指定一個給定的列值或列值集合應(yīng)該保存在哪個分區(qū)中;而在HASH分區(qū)中竖般,MySOL自動完成這些工作甚垦,用戶所要做的只是基于將要被哈希的列值指定一個列值或表達(dá)式,以及指定被分區(qū)的表將要被分割成的分區(qū)數(shù)量涣雕。
create table emp(
  `no` varchar(20) not null,
  `name` varchar(20),
  deptno int,
  birthdate date,
  salary int
)
partition by hash(year(birthdate)) partitions 4;
  1. KEY分區(qū):類似于hash分區(qū)艰亮,區(qū)別在于key分區(qū)只支持計算一列或多列,且MySQL服務(wù)器其自身的哈希函數(shù)挣郭,必須有一列或多列包含整數(shù)值迄埃。這些函數(shù)是基于password()一樣的運算規(guī)則
create table emp(
  `no` varchar(20) not null,
  `name` varchar(20),
  deptno int,
  birthdate date,
  salary int
)
partition by key(year(birthdate)) partitions 4;

*說明:在MySQL5.1版本中,RANGE,LIST,HASH分區(qū)要求分區(qū)鍵必須是INT類型丈屹,或者通過表達(dá)式返回INT類型调俘。但KEY分區(qū)的時候伶棒,可以使用其他類型的列(BLOB旺垒,TEXT類型除外)作為分區(qū)鍵。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肤无,一起剝皮案震驚了整個濱河市先蒋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宛渐,老刑警劉巖竞漾,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窥翩,居然都是意外死亡业岁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門寇蚊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笔时,“玉大人,你說我怎么就攤上這事仗岸≡使ⅲ” “怎么了借笙?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長较锡。 經(jīng)常有香客問我业稼,道長,這世上最難降的妖魔是什么蚂蕴? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任低散,我火速辦了婚禮,結(jié)果婚禮上骡楼,老公的妹妹穿的比我還像新娘谦纱。我一直安慰自己,他們只是感情好君编,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布跨嘉。 她就那樣靜靜地躺著,像睡著了一般吃嘿。 火紅的嫁衣襯著肌膚如雪祠乃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天兑燥,我揣著相機(jī)與錄音亮瓷,去河邊找鬼。 笑死降瞳,一個胖子當(dāng)著我的面吹牛嘱支,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挣饥,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼除师,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扔枫?” 一聲冷哼從身側(cè)響起汛聚,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎短荐,沒想到半個月后倚舀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡忍宋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年痕貌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糠排。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡舵稠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柱查,我是刑警寧澤廓俭,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站唉工,受9級特大地震影響研乒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜淋硝,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一雹熬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谣膳,春花似錦竿报、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至花履,卻和暖如春芽世,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诡壁。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工济瓢, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妹卿。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓旺矾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夺克。 傳聞我的和親對象是個殘疾皇子箕宙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

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

  • 獲取關(guān)于分區(qū)的信息 本章討論MySQL 5.1.中實現(xiàn)的分區(qū)。關(guān)于分區(qū)和分區(qū)概念的介紹可以在18.1節(jié)懊直,“M...
    裘馬輕狂大帥閱讀 728評論 0 51
  • 分區(qū)是指根據(jù)一定的規(guī)則扒吁,數(shù)據(jù)庫把一個表分解成多個更小的,更容易管理的部分室囊。就訪問數(shù)據(jù)庫的應(yīng)用而言,邏輯上只有一個表...
    微日月閱讀 1,493評論 0 7
  • mysql分區(qū) Mysql支持水平分區(qū)魁索,并不支持垂直分區(qū);水平分區(qū):指將同一表中不同行的記錄分配到不同的物理文件中...
    Gundy_閱讀 886評論 0 2
  • 分區(qū): 分區(qū)的功能不是在存儲引擎層實現(xiàn)的融撞。因此不只是InnoDB才支持分區(qū)。MyISAM粗蔚、NDB都支持分區(qū)操作尝偎。 ...
    4ea0af17fd67閱讀 1,763評論 0 0
  • 分區(qū)依據(jù)的字段必須是主鍵/唯一索引的組成部分,分區(qū)是為了快速定位數(shù)據(jù),因此該字段的搜索頻次較高應(yīng)作為強(qiáng)檢索字段致扯,否...
    尹楷楷閱讀 2,053評論 0 1