MySQL學(xué)習(xí)——分區(qū)表

MySQL存儲(chǔ)引擎現(xiàn)狀及發(fā)展趨勢(shì)

MySQL官網(wǎng)有這樣一句話:

As of MySQL 5.7.17, the generic partitioning handler in the MySQL server is deprecated, and is removed in MySQL 8.0, when the storage engine used for a given table is expected to provide its own (“native”) partitioning handler. Currently, only the InnoDB and NDB storage engines do.

大意為MySQL 8.0中將會(huì)移除普通的分區(qū)而只支持存儲(chǔ)引擎內(nèi)置分區(qū)的方式旗国。
如下文所示,即為普通的分區(qū)方式:

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'  
);

這里我們可以有一個(gè)最基本的判斷邏輯注整,假如數(shù)據(jù)庫(kù)表沒有指定存儲(chǔ)引擎能曾,即可認(rèn)為是MySQL不建議使用的分區(qū)方式。當(dāng)在5.7版本中使用時(shí)肿轨,MySQL將提示:

The partition engine, used by table 'table_name', is deprecated and
will be removed in a future release. Please use native partitioning instead.

用戶在這時(shí)為數(shù)據(jù)庫(kù)表指定存儲(chǔ)引擎InnoDB或NDB即可寿冕。

ALTER TABLE table_name ENGINE = INNODB;

分區(qū)表的優(yōu)勢(shì)

  • 分區(qū)使得可以將一個(gè)表中的更多數(shù)據(jù)存儲(chǔ)在單個(gè)磁盤或文件系統(tǒng)分區(qū)上。
  • 由于滿足給定WHERE子句的數(shù)據(jù)只能存儲(chǔ)在一個(gè)或多個(gè)分區(qū)上椒袍,因此可以將搜索中的剩余分區(qū)自動(dòng)排除驼唱,可以大大優(yōu)化一些查詢。
  • 此外驹暑,MySQL 5.7支持查詢的顯式分區(qū)選擇玫恳。 例如,SELECT * FROM t PARTITION(p0优俘,p1)WHERE c <5僅選擇與WHERE條件匹配的分區(qū)p0和p1中的那些行京办。 在這種情況下,MySQL不會(huì)檢查表t的任何其他分區(qū); 當(dāng)您已經(jīng)知道要檢查的分區(qū)或分區(qū)時(shí)帆焕,這可以大大加快查詢速度惭婿。
  • 涉及聚合函數(shù)(如SUM()和COUNT()的查詢可以輕松并行化。
  • 憑借擴(kuò)展數(shù)據(jù)實(shí)現(xiàn)更大的查詢吞吐量,可以查找多個(gè)磁盤审孽。

分區(qū)表的基本概念

對(duì)用戶而言县袱,分區(qū)表是一個(gè)獨(dú)立的邏輯表,但是底層由多個(gè)物理子表組成佑力。實(shí)現(xiàn)分區(qū)的代碼實(shí)際上是對(duì)一組底層表的句柄對(duì)象(Handler Object)的封裝式散。對(duì)分區(qū)表的請(qǐng)求,都會(huì)通過(guò)句柄對(duì)象轉(zhuǎn)化成對(duì)存儲(chǔ)引擎的接口調(diào)用打颤。所以分區(qū)對(duì)于SQL層來(lái)說(shuō)是一個(gè)完全封閉底層實(shí)現(xiàn)的黑盒子暴拄,對(duì)應(yīng)用是透明的,但是從底層的文件系統(tǒng)也就很容易發(fā)現(xiàn)编饺,每個(gè)分區(qū)表都有一個(gè)使用#分隔命名的表文件乖篷。
在下面的場(chǎng)景中,分區(qū)可以起到非常大的作用:

  • 表非常大以至于無(wú)法全部放在內(nèi)存中透且,或者只在表的最后部分有熱點(diǎn)數(shù)據(jù)撕蔼,其他均是歷史數(shù)據(jù)。
  • 分區(qū)表的數(shù)據(jù)更容易維護(hù)秽誊。例如鲸沮,想批量刪除大量數(shù)據(jù)可以使用清除整個(gè)分區(qū)的方式
  • 分區(qū)表的數(shù)據(jù)可以分布在不同的物理設(shè)備上,從而高效地利用多個(gè)硬件設(shè)備锅论。
  • 可以使用分區(qū)表來(lái)避免某些特殊的瓶頸讼溺,例如InnoDB的單個(gè)索引的互斥訪問(wèn)、ext3文件系統(tǒng)的inode鎖競(jìng)爭(zhēng)等最易。

分區(qū)表本身也有一些限制:

  • 一個(gè)表最多只能有1024個(gè)分區(qū)
  • 在MySQL5.1中怒坯,分區(qū)表達(dá)式必須是整數(shù),或者是返回整數(shù)的表達(dá)式藻懒。在MySQL5.5中剔猿,某些場(chǎng)景中可以直接使用列表來(lái)進(jìn)行分區(qū)。
  • 如果分區(qū)字段中有主鍵或者唯一索引的列嬉荆,那么 所有主鍵列和唯一索引列都必須包含進(jìn)來(lái)艳馒。
  • 分區(qū)表中無(wú)法使用外鍵約束。

分區(qū)表的原理

分區(qū)表由多個(gè)相關(guān)的底層表實(shí)現(xiàn)员寇,這些底層表也是由句柄對(duì)象(Handler object)表示弄慰,所以我們也可以直接訪問(wèn)各個(gè)分區(qū)。存儲(chǔ)引擎管理分區(qū)的各個(gè)底層表和管理普通表一樣(所有的底層表都必須使用相同的存儲(chǔ)引擎)蝶锋,分區(qū)表的索引只是在各個(gè)底層表上各自加上一個(gè)完全相同的索引陆爽。從存儲(chǔ)引擎的角度來(lái)看,底層表和一個(gè)普通表沒有任何不同扳缕,存儲(chǔ)引擎也無(wú)須知道這是一個(gè)普通表還是分區(qū)表的一部分慌闭。
分區(qū)表的操作邏輯:
SELECT查詢
當(dāng)查詢一個(gè)分區(qū)表的時(shí)候别威,分區(qū)表先打開并鎖住所有的底層表,優(yōu)化器先判斷是否可以過(guò)濾部分分區(qū)驴剔,然后再調(diào)用對(duì)應(yīng)的存儲(chǔ)引擎訪問(wèn)各個(gè)分區(qū)的數(shù)據(jù)省古。
INSERT操作
當(dāng)寫入一條記錄時(shí),分區(qū)層先打開并鎖住所有的底層表丧失,然后確定哪個(gè)分區(qū)接受這條記錄豺妓,再將記錄寫入對(duì)應(yīng)底層表。
DELETE操作
當(dāng)刪除一條記錄時(shí)布讹,分區(qū)層先打開并鎖住所有的底層表琳拭,然后確定數(shù)據(jù)對(duì)應(yīng)的分區(qū),最后對(duì)相應(yīng)底層表進(jìn)行刪除操作描验。
UPDATE操作
當(dāng)更新一條記錄時(shí)白嘁,分區(qū)層先打開并鎖住所有的底層表柿扣,MySQL先確定需要更新的記錄在哪個(gè)分區(qū)澈灼,然后取出并更新,再判斷更新后的數(shù)據(jù)應(yīng)該放在哪個(gè)分區(qū)荠锭,最后對(duì)底層表進(jìn)行寫入操作呼股,并對(duì)原數(shù)據(jù)所在的底層表進(jìn)行刪除操作耕魄。

分區(qū)表的類型

MySQL支持多種分區(qū)表。用的最多的是根據(jù)范圍進(jìn)行分區(qū)卖怜;還支持鍵值屎开、哈希和列表分區(qū)阐枣。

例马靠,根據(jù)范圍進(jìn)行分區(qū):
CREATE TABLE sales (
    id INT AUTO_INCREMENT,
    amount DOUBLE NOT NULL,
    order_day DATETIME NOT NULL,
    PRIMARY KEY(id, order_day)
) ENGINE=Innodb PARTITION BY RANGE(YEAR(order_day)) (
    PARTITION p_2010 VALUES LESS THAN (2010),
    PARTITION p_2011 VALUES LESS THAN (2011),
    PARTITION p_2012 VALUES LESS THAN (2012),
    PARTITION p_catchall VALUES LESS THAN MAXVALUE);

什么情況下會(huì)出問(wèn)題

  • NULL值會(huì)使過(guò)濾無(wú)效
  • 分區(qū)列和索引列不匹配
  • 選擇分區(qū)的成本可能很高
  • 打開并鎖住所有底層表的成本可能很高
  • 維護(hù)分區(qū)的成本可能很高

使用分區(qū)表的限制:

  • 所有分區(qū)都必須使用相同的存儲(chǔ)引擎
  • 分區(qū)函數(shù)中可以使用的函數(shù)和表達(dá)式也有一些限制
  • 某些存儲(chǔ)引擎不支持分區(qū)
  • 對(duì)于MyISAM的分區(qū)表,不能再使用LOAD INDEX INTO CACHE操作
  • 對(duì)于MyISAM表蔼两,使用分區(qū)表時(shí)需要打開更多的文件描述符甩鳄。

參考文獻(xiàn)

  1. 《高性能MySQL》
  2. MySQL分區(qū)(官網(wǎng))
  3. 原文鏈接
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市额划,隨后出現(xiàn)的幾起案子妙啃,更是在濱河造成了極大的恐慌,老刑警劉巖俊戳,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揖赴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡抑胎,警方通過(guò)查閱死者的電腦和手機(jī)燥滑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)阿逃,“玉大人铭拧,你說(shuō)我怎么就攤上這事赃蛛。” “怎么了搀菩?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵呕臂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我肪跋,道長(zhǎng)歧蒋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任澎嚣,我火速辦了婚禮疏尿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘易桃。我一直安慰自己褥琐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布晤郑。 她就那樣靜靜地躺著敌呈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪造寝。 梳的紋絲不亂的頭發(fā)上磕洪,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音诫龙,去河邊找鬼析显。 笑死,一個(gè)胖子當(dāng)著我的面吹牛签赃,可吹牛的內(nèi)容都是我干的谷异。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锦聊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼歹嘹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起孔庭,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤尺上,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后圆到,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怎抛,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年芽淡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了马绝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吐绵,死狀恐怖迹淌,靈堂內(nèi)的尸體忽然破棺而出河绽,到底是詐尸還是另有隱情,我是刑警寧澤唉窃,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布耙饰,位于F島的核電站,受9級(jí)特大地震影響纹份,放射性物質(zhì)發(fā)生泄漏苟跪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一蔓涧、第九天 我趴在偏房一處隱蔽的房頂上張望件已。 院中可真熱鬧,春花似錦元暴、人聲如沸篷扩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鉴未。三九已至,卻和暖如春鸠姨,著一層夾襖步出監(jiān)牢的瞬間铜秆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工讶迁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留连茧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓巍糯,卻偏偏與公主長(zhǎng)得像啸驯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鳞贷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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