您好,登錄后才能下訂單哦!
這篇文章主要介紹“MySQL分區(qū)表的分區(qū)原理及優(yōu)缺點(diǎn)”,在日常操作中,相信很多人在MySQL分區(qū)表的分區(qū)原理及優(yōu)缺點(diǎn)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”MySQL分區(qū)表的分區(qū)原理及優(yōu)缺點(diǎn)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
1.分區(qū)表的原理
分區(qū)表是由多個(gè)相關(guān)的底層表實(shí)現(xiàn),這些底層表也是由句柄對(duì)象表示,所以我們也可以直接訪問(wèn)各個(gè)分區(qū),存儲(chǔ)引擎管理分區(qū)的各個(gè)底層表和管理普通表一樣(所有的底層表都必須使用相同的存儲(chǔ)引擎),分區(qū)表的索引只是在各個(gè)底層表上各自加上一個(gè)相同的索引,從存儲(chǔ)引擎的角度來(lái)看,底層表和一個(gè)普通表沒(méi)有任何不同,存儲(chǔ)引擎也無(wú)須知道這是一個(gè)普通表還是一個(gè)分區(qū)表的一部分。
在分區(qū)表上的操作按照下面的操作邏輯進(jìn)行:
select查詢(xún):
當(dāng)查詢(xún)一個(gè)分區(qū)表的時(shí)候,分區(qū)層先打開(kāi)并鎖住所有的底層表,優(yōu)化器判斷是否可以過(guò)濾部分分區(qū),然后再調(diào)用對(duì)應(yīng)的存儲(chǔ)引擎接口訪問(wèn)各個(gè)分區(qū)的數(shù)據(jù)
insert操作:
當(dāng)寫(xiě)入一條記錄時(shí),分區(qū)層打開(kāi)并鎖住所有的底層表,然后確定哪個(gè)分區(qū)接受這條記錄,再將記錄寫(xiě)入對(duì)應(yīng)的底層表
delete操作:
當(dāng)刪除一條記錄時(shí),分區(qū)層先打開(kāi)并鎖住所有的底層表,然后確定數(shù)據(jù)對(duì)應(yīng)的分區(qū),最后對(duì)相應(yīng)底層表進(jìn)行刪除操作
update操作:
當(dāng)更新一條數(shù)據(jù)時(shí),分區(qū)層先打開(kāi)并鎖住所有的底層表,mysql先確定需要更新的記錄在哪個(gè)分區(qū),然后取出數(shù)據(jù)并更新,再判斷更新后的數(shù)據(jù)應(yīng)該放在哪個(gè)分區(qū),然后對(duì)底層表進(jìn)行寫(xiě)入操作,并對(duì)原數(shù)據(jù)所在的底層表進(jìn)行刪除操作
雖然每個(gè)操作都會(huì)打開(kāi)并鎖住所有的底層表,但這并不是說(shuō)分區(qū)表在處理過(guò)程中是鎖住全表的,如果存儲(chǔ)引擎能夠自己實(shí)現(xiàn)行級(jí)鎖,如:innodb,則會(huì)在分區(qū)層釋放對(duì)應(yīng)的表鎖,這個(gè)加鎖和解鎖過(guò)程與普通Innodb上的查詢(xún)類(lèi)似。
2.在下面的場(chǎng)景中,分區(qū)可以起到非常大的作用:
A:表非常大以至于無(wú)法全部都放在內(nèi)存中,或者只在表的最后部分有熱點(diǎn)數(shù)據(jù),其他都是歷史數(shù)據(jù)
B:分區(qū)表的數(shù)據(jù)更容易維護(hù),如:想批量刪除大量數(shù)據(jù)可以使用清除整個(gè)分區(qū)的方式。另外,還可以對(duì)一個(gè)獨(dú)立分區(qū)進(jìn)行優(yōu)化、檢查、修復(fù)等操作
C:分區(qū)表的數(shù)據(jù)可以分布在不同的物理設(shè)備上,從而高效地利用多個(gè)硬件設(shè)備
D:可以使用分區(qū)表來(lái)避免某些特殊的瓶頸,如:innodb的單個(gè)索引的互斥訪問(wèn),ext3文件系統(tǒng)的inode鎖競(jìng)爭(zhēng)等
E:如果需要,還可以備份和恢復(fù)獨(dú)立的分區(qū),這在非常大的數(shù)據(jù)集的場(chǎng)景下效果非常好
F:優(yōu)化查詢(xún),在where字句中包含分區(qū)列時(shí),可以只使用必要的分區(qū)來(lái)提高查詢(xún)效率,同時(shí)在涉及sum()和count()這類(lèi)聚合函數(shù)的查詢(xún)時(shí),可以在每個(gè)分區(qū)上面并行處理,最終只需要匯總所有分區(qū)得到的結(jié)果。
3.分區(qū)本身也有一些限制:
A:一個(gè)表最多只能有1024個(gè)分區(qū)(mysql5.6之后支持8192個(gè)分區(qū))
B:在mysql5.1中分區(qū)表達(dá)式必須是整數(shù),或者是返回整數(shù)的表達(dá)式,在5.5之后,某些場(chǎng)景可以直接使用字符串列和日期類(lèi)型列來(lái)進(jìn)行分區(qū)(使用varchar字符串類(lèi)型列時(shí),一般還是字符串的日期作為分區(qū))。
C:如果分區(qū)字段中有主鍵或者唯一索引列,那么所有主鍵列和唯一索引列都必須包含進(jìn)來(lái),如果表中有主鍵或唯一索引,那么分區(qū)鍵必須是主鍵或唯一索引
D:分區(qū)表中無(wú)法使用外鍵約束
E:mysql數(shù)據(jù)庫(kù)支持的分區(qū)類(lèi)型為水平分區(qū),并不支持垂直分區(qū),因此,mysql數(shù)據(jù)庫(kù)的分區(qū)中索引是局部分區(qū)索引,一個(gè)分區(qū)中既存放了數(shù)據(jù)又存放了索引,而全局分區(qū)是指的數(shù)據(jù)庫(kù)放在各個(gè)分區(qū)中,但是所有的數(shù)據(jù)的索引放在另外一個(gè)對(duì)象中
F:目前mysql不支持空間類(lèi)型和臨時(shí)表類(lèi)型進(jìn)行分區(qū)。不支持全文索引
4.子分區(qū)的建立需要注意以下幾個(gè)問(wèn)題:
A:每個(gè)子分區(qū)的數(shù)量必須相同
B:只要在一個(gè)分區(qū)表的任何分區(qū)上使用subpartition來(lái)明確定義任何子分區(qū),就必須在所有分區(qū)上定義子分區(qū),不能漏掉一些分區(qū)不進(jìn)行子分區(qū)。
C:每個(gè)subpartition子句必須包括子分區(qū)的一個(gè)名字
D:子分區(qū)的名字必須是唯一的,不能在一張表中出現(xiàn)重名的子分區(qū)
E:mysql數(shù)據(jù)庫(kù)的分區(qū)總是把null當(dāng)作比任何非null更小的值,這和數(shù)據(jù)庫(kù)中處理null值的order by操作是一樣的,升序排序時(shí)null總是在最前面,因此對(duì)于不同的分區(qū)類(lèi)型,mysql數(shù)據(jù)庫(kù)對(duì)于null的處理也各不相同。對(duì)于range分區(qū),如果向分區(qū)列插入了null,則mysql數(shù)據(jù)庫(kù)會(huì)將該值放入最左邊的分區(qū),注意,如果刪除分區(qū),分區(qū)下的所有內(nèi)容都從磁盤(pán)中刪掉了,null所在分區(qū)被刪除,null值也就跟著被刪除了。在list分區(qū)下要使用null,則必須顯式地定義在分區(qū)的散列值中,否則插入null時(shí)會(huì)報(bào)錯(cuò)。hash和key分區(qū)對(duì)于null的處理方式和range,list分區(qū)不一樣,任何分區(qū)函數(shù)都會(huì)將null返回為0.
到此,關(guān)于“MySQL分區(qū)表的分區(qū)原理及優(yōu)缺點(diǎn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。