分區(qū)是一種表的設(shè)計(jì)模式。通常,表分區(qū)是根據(jù)條件將一個(gè)大表分為幾個(gè)小表。 但是對(duì)于應(yīng)用程序來(lái)說(shuō),分區(qū)表與沒(méi)有分區(qū)的表是相同的。換句話說(shuō),分區(qū)對(duì)應(yīng)用程序是透明的,但是數(shù)據(jù)庫(kù)卻會(huì)重新排列數(shù)據(jù)。在進(jìn)行的項(xiàng)目中,我們需要保存大量的、有效的數(shù)據(jù),為了提高查詢效率并快速刪除過(guò)期數(shù)據(jù),我們選擇了MySQL分區(qū)機(jī)制。那么MySQL數(shù)據(jù)庫(kù)如何對(duì)表進(jìn)行分區(qū)?
分區(qū)類(lèi)型
1.Range分區(qū):最為常用,基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。最常見(jiàn)的是基于時(shí)間字段?;诜謪^(qū)的列最好是整型,如果日期型的可以使用函數(shù)轉(zhuǎn)換為整型。
2.List分區(qū):LIST分區(qū)和RANGE分區(qū)類(lèi)似,區(qū)別在于LIST是枚舉值列表的集合,RANGE是連續(xù)的區(qū)間值的集合。
3.Hash分區(qū):基于給定的分區(qū)個(gè)數(shù),將數(shù)據(jù)分配到不同的分區(qū),HASH分區(qū)只能針對(duì)整數(shù)進(jìn)行HASH,對(duì)于非整形的字段只能通過(guò)表達(dá)式將其轉(zhuǎn)換成整數(shù)。
4.Key分區(qū):KEY分區(qū)其實(shí)跟HASH分區(qū)差不多,不同點(diǎn)如下:
(1)KEY分區(qū)允許多列,而HASH分區(qū)只允許一列。
(2)如果在有主鍵或者唯一鍵的情況下,key中分區(qū)列可不指定,默認(rèn)為主鍵或者唯一鍵,如果沒(méi)有,則必須顯性指定列。
(3)KEY分區(qū)對(duì)象必須為列,而不能是基于列的表達(dá)式。
(4)KEY分區(qū)和HASH分區(qū)的算法不一樣,PARTITION BY HASH (expr),MOD取值的對(duì)象是expr返回的值,而PARTITION BY KEY (column_list),基于的是列的MD5值。
分區(qū)命令
創(chuàng)建分區(qū)
創(chuàng)建后可以看到,每個(gè)分區(qū)都會(huì)對(duì)應(yīng)1個(gè)ibd文件
注意事項(xiàng)
1.MySQL分區(qū)中如果存在主鍵或唯一鍵,則分區(qū)列必須包含在其中(否則判斷主鍵或唯一時(shí),需要掃描所有分區(qū));
2.分區(qū)字段不能為NULL,要不然怎么確定分區(qū)范圍呢,所以盡量NOT NULL;
3.最大分區(qū)數(shù)目不能超過(guò)1024;
4.不支持外鍵;
5.只能對(duì)數(shù)據(jù)表的整型列進(jìn)行分區(qū),或者數(shù)據(jù)列可以通過(guò)分區(qū)函數(shù)轉(zhuǎn)化成整型列;
6.分區(qū)表不影響自增列。
常見(jiàn)問(wèn)題
1.A PRIMARY KEY must include all columns in the table's partitioning function:這樣的話判斷主鍵是否唯一就可以在單個(gè)分區(qū)內(nèi)部完成,否則就需要跨所有的分區(qū);
2.MAXVALUE can only be used in last partition definition:RANGE表分區(qū)后不能帶MAXVALUE分區(qū),否則無(wú)法增加分區(qū)。或者就只能重新分區(qū)了;
3.Table has no partition for value 737425:因?yàn)榉謪^(qū)的范圍沒(méi)有包含所有可能的記錄的值。
到此這篇關(guān)于MySQL數(shù)據(jù)庫(kù)是如何分區(qū)表的文章就介紹到這了,更多相關(guān)MySQL數(shù)據(jù)庫(kù)分區(qū)表的內(nèi)容,請(qǐng)繼續(xù)關(guān)注中培偉業(yè)。