1、什么是分區(qū)表
? ? ? ? 分區(qū)表是一個邏輯表,但底層是由多個物理子表組成的,分區(qū)表的實現(xiàn)其實是對一組底層表的句柄對象的封裝,對分區(qū)表的請求都通過句柄對象轉(zhuǎn)化為對存儲引擎的接口調(diào)用,分區(qū)對于sql層來說是一個完全封裝的黑盒子,但其實底層每一個分區(qū)都有一個使用#分割命名的表文件。
2、分區(qū)表和分表的區(qū)別
? ? ? (1)概念上的區(qū)別:
? ? ? ? 分表:是通過一定的規(guī)則,將一張表分解為N張不同的表,再物理層面也是多張表;
? ? ? ? 分區(qū):邏輯上是一張表,只是把一張表分成了N多個物理區(qū)塊,這些區(qū)塊可以在同一個磁盤、也可以在不同的磁盤。
? ? ? (2)實現(xiàn)方式上的區(qū)別
? ? ? ? ? ? 每一張表都對應(yīng)了3個文件:一個.MYD數(shù)據(jù)文件、一個.MYI索引文件、一個.FRM表結(jié)構(gòu)文件
? ? ? ? ? ? 分表:mysql的分表是物理上的分表,每一個小表都是完整的一張小表,都對應(yīng)3個文件;
? ? ? ? ? ? 分區(qū):分區(qū)后還是一張表,但是存放的數(shù)據(jù)的區(qū)塊變多了;分區(qū)后根據(jù)一定的規(guī)則把數(shù)據(jù)文件和索引文件進(jìn)行了分割,還多出一個.par文件,該文件記錄了這張表的分區(qū)信息;
? ? ? (3)數(shù)據(jù)處理上
? ? ? ? ? ? 分區(qū):只是把存放數(shù)據(jù)的文件分成了許多小塊;
? ? (4)提高性能上
? ? ? ? ? ? 分表:分表后,單表的并發(fā)能力提高了,磁盤IO性能更高了,為什么能夠提高并發(fā)呢?因為查詢一次花的時間變短了,如果出現(xiàn)并發(fā),可以把壓力分個不同的子表;磁盤IO為什么高了呢?因為本來? 把一個非常大的數(shù)據(jù)文件也分?jǐn)偟搅烁鱾€小表的數(shù)據(jù)文件上了。
? ? ? ? ? 分區(qū):重點(diǎn)是想突破磁盤io瓶頸,想提高磁盤讀寫的能力來增加mysql的性能;在這一點(diǎn)上分區(qū)和分表的側(cè)重點(diǎn)不同,分表重點(diǎn)是存取數(shù)據(jù)時提高mysql的并發(fā)能力(因為壓力都分散到了不同的表上,而且查詢性能高、時間短了);而分區(qū)重點(diǎn)是突破磁盤的讀寫能力(因為數(shù)據(jù)在物理上被分為了多個小塊來存儲,讀寫時只需要讀取那一小塊即可)。
分表和分區(qū)不矛盾,可以相互配合的,對于那些大訪問量,并且表數(shù)據(jù)比較多的表,我們可以采取分表和分區(qū)結(jié)合的方式;訪問量不大,但是表數(shù)據(jù)很多的表,我們可以采取分區(qū)的方式。
? 3、分區(qū)表的好處
? ? ? (1)分區(qū)表把數(shù)據(jù)存放在不同的物理區(qū)塊上,提高了磁盤io性能;
? ? ? (2)可優(yōu)化查詢,在where語句中包含分區(qū)條件時,可以只掃描一個或多個分區(qū)表來提高查詢效率,涉及sum、count語句時,也可以在多個分區(qū)上并行處理,最好再匯總;
? ? ? (3)分區(qū)更易維護(hù),如:批量刪除大量數(shù)據(jù)可以清楚整個分區(qū);
? ? ? (4)使用分區(qū)可避免某些特殊的瓶頸,如InnoDB的單個索引的互斥訪問等。
? ? ? ?(5)并行處理性能更高。
? 4、分區(qū)表的限制
? ? ? (1)一個表最多只能有1024個分區(qū);
? ? ? (2)分區(qū)字段要么不包含主鍵或者索引列,要么包含全部主鍵和索引列;‘
? ? ? (3)不能只對表數(shù)據(jù)分區(qū)而不對索引分區(qū),也不能只對索引分區(qū)而不對表分區(qū)。
5、mysql支持的分區(qū)類型
? ? (1)range分區(qū):根據(jù)數(shù)值的區(qū)間范圍分區(qū),分區(qū)的區(qū)間范圍值是順序的,且不能重疊;分區(qū)鍵的值如果有null,將被作為最小值來處理;插入的值不再現(xiàn)有分區(qū)內(nèi)會報錯,所以要預(yù)估現(xiàn)有分區(qū),及時新增新的分區(qū)。
? ? (2)list分區(qū):按照list中的值分區(qū),partition p0 values in (3,5);值為3和5的在一個分區(qū);分區(qū)值不需要按照順序,插入的值不再list范圍內(nèi)會報錯;null值必須在分區(qū)列表中否則不被接受
? ? (3)hash分區(qū):主要用于分散熱點(diǎn)讀,確保數(shù)據(jù)在預(yù)先確定個數(shù)的分區(qū)中盡可能平均分布,null值被當(dāng)作0值處理;分為常規(guī)hash分區(qū):
? ? ? ? 常規(guī)hash分區(qū):使用取模算法,優(yōu)點(diǎn)是數(shù)據(jù)均勻分布,缺點(diǎn)是不適合經(jīng)常變動的需求,比如數(shù)據(jù)量增大后由mod(n,4)變?yōu)閙od(n,6),這樣大部分?jǐn)?shù)據(jù)就需要重新計算分區(qū),線下hash分區(qū)很好的解決了這個問題。
? ? ? ? ? 線性分區(qū):分區(qū)函數(shù)是一個線性的2的冪的運(yùn)算法則
? ? (4)columns分區(qū):在mysql5.5中引入,解決了range分區(qū)和list分區(qū)值只支持整數(shù)的問題,columns分區(qū)可細(xì)分為range columns分區(qū)和list columns分區(qū),他們都支持整數(shù)、日期時間、字符串三大類型,也可支持多列分區(qū)
? ? (4)key分區(qū):以上幾種分區(qū)都要求分區(qū)鍵必須是int類型的,或者表達(dá)式返回int類型,但是key分區(qū)可以使用其他類型的列(blob、text類型)
6、什么時候使用分區(qū)表
數(shù)據(jù)量達(dá)到1g時就該考慮分區(qū),對于歷史數(shù)據(jù)的修改不多的情況下也可以考慮分區(qū)
裝載:https://my.oschina.net/zhengyp/blog/494038
https://my.oschina.net/u/195896/blog/75029
https://my.oschina.net/u/131940/blog/550154