mf怎么使mysql信息分区_细聊MySQL的分区功能
此篇主要介紹下MySQL的分區(qū)功能。我們分別從分區(qū)的概念、分區(qū)對(duì)于MySQL應(yīng)用的優(yōu)點(diǎn)、分區(qū)的類別及設(shè)置來(lái)和大家一起探討下MySQL的分區(qū)。
什么是分區(qū)?
MySQL在未啟用分區(qū)功能時(shí),數(shù)據(jù)庫(kù)的單個(gè)表內(nèi)容是以單個(gè)文件的形式存放在文件系統(tǒng)上的。當(dāng)啟用分區(qū)功能后,MySQL將按用戶指定的規(guī)則將單個(gè)表內(nèi)容分割成幾個(gè)文件存放在文件系統(tǒng)上。分區(qū)分為水平分區(qū)和垂直分區(qū),水平分區(qū)是將表的數(shù)據(jù)按行分割成不同的數(shù)據(jù)文件,而垂直分區(qū)則是將表的數(shù)據(jù)按列分割成不同的數(shù)據(jù)文件。分片要遵循完備性原則、可重構(gòu)性原則與不相交原則。完備性代表所有數(shù)據(jù)必須映射到某個(gè)片段上。可重構(gòu)性表示所有分片數(shù)據(jù)必須可以重新構(gòu)成全局?jǐn)?shù)據(jù)。不相交性表示不同分片上的數(shù)據(jù)沒(méi)有重復(fù)(除非你是特意做的冗余)。
由于自MySQL 5.7起已不支持垂直分區(qū),所以此篇文章主要介紹數(shù)據(jù)庫(kù)的水平分區(qū)。
分區(qū)的優(yōu)勢(shì)
1、由于分區(qū)可以將表數(shù)據(jù)分割成不同的文件,并分配到不同的磁盤,因此分區(qū)可以在一個(gè)表中存放更多的數(shù)據(jù)。
2、分區(qū)后可以快速的移除不需要的數(shù)據(jù)或添加新的數(shù)據(jù)。舉個(gè)例子,如果按時(shí)間范圍分區(qū),分區(qū)規(guī)則為從開始至2010年設(shè)置為分區(qū)1,2011年至2013年設(shè)置為分區(qū)2,2014年至現(xiàn)在設(shè)置為分區(qū)3。如果我想刪除2010年之前的數(shù)據(jù),那么只用刪除分區(qū)1即可,而無(wú)需掃描整個(gè)表。
3、分區(qū)可以優(yōu)化查詢,你可以將經(jīng)常需要被查詢的內(nèi)容設(shè)置為一個(gè)分區(qū),這樣查詢數(shù)據(jù)時(shí)就可以直接顯示分區(qū)的內(nèi)容。例如,你可以利用SELECT
* FROM t PARTITION(p0,p1) WHERE c <
5來(lái)查詢p0與p1兩個(gè)分區(qū)下的內(nèi)容。這樣系統(tǒng)掃描的行會(huì)更少,加快了查詢效率。由于查詢條件可能在一段時(shí)間后有所變動(dòng),此時(shí)我們需要重新調(diào)整分區(qū)規(guī)則。所以,數(shù)據(jù)庫(kù)是需要經(jīng)常維護(hù)的。
分區(qū)類別
我們可以根據(jù)范圍、列表、哈希與關(guān)鍵字這四種類別進(jìn)行分區(qū)。范圍分區(qū)是根據(jù)用戶指定某列的范圍值進(jìn)行分區(qū)。列表分區(qū)類似于范圍分區(qū),但列表分區(qū)必須根據(jù)用戶具體指定的集合進(jìn)行分區(qū)。哈希分區(qū)根據(jù)用戶表達(dá)式返回的正整數(shù)值進(jìn)行分區(qū)。關(guān)鍵字分區(qū)類似與哈希分區(qū),一般根據(jù)用戶指定的關(guān)鍵列名進(jìn)行分區(qū)。下面,我們就來(lái)詳細(xì)了解下這四種分區(qū)的相關(guān)用法。
范圍分區(qū)
我們以例子來(lái)說(shuō)明如何設(shè)置范圍分區(qū)。首先創(chuàng)建一個(gè)表
這是一張雇員表,fname為first name,lname為last name,hired為聘用時(shí)間,separated為離職時(shí)間,job_code為工號(hào),store_id為此雇員屬于哪個(gè)門店。
我們可以用多種方式對(duì)它進(jìn)行范圍分區(qū),可以根據(jù)門店ID的范圍,聘用時(shí)間的范圍,工號(hào)的范圍均可。下面我們根據(jù)門店ID的范圍對(duì)此表進(jìn)行分區(qū),SQL聲明如下:
在這種分區(qū)設(shè)置下,門店ID1~5的雇員信息被分配到分區(qū)p0中,6~10的雇員信息被分配到分區(qū)p1中,以此類推。如果你的store_id確定在1~20之間,此種分區(qū)方法是沒(méi)有問(wèn)題的。那么,如果你的store_id不確定,當(dāng)出現(xiàn)store_id的值為大于21的值時(shí),此分區(qū)設(shè)置就會(huì)導(dǎo)致錯(cuò)誤,因?yàn)槲覀儧](méi)有分配store_id大于21時(shí)的行到任何一個(gè)分區(qū)。要解決這個(gè)問(wèn)題,我們需要引進(jìn)關(guān)鍵字“MAXVALUE”,按如下的SQL聲明,即可解決store_id不固定的問(wèn)題。
當(dāng)然,我們也可以按照時(shí)間范圍來(lái)進(jìn)行分區(qū),具體就看個(gè)人的應(yīng)用場(chǎng)景了。值得注意的是,由于MySQL的bug,在按照時(shí)間范圍來(lái)進(jìn)行分區(qū)時(shí),如果你需要轉(zhuǎn)化成時(shí)間戳來(lái)分區(qū),則最好使用UNIX_TIMESTAMP函數(shù)而不是TIMESTAMP函數(shù)。
列表分區(qū)
列表分區(qū)在我看來(lái)是一種比較“笨”的分區(qū)方法,因?yàn)樗冒蚜兄械乃锌赡苤碉@式寫在SQL聲明中。還是以employees表為例。我們按store_id,以列表的方式進(jìn)行分區(qū)。假設(shè)我們將門店分為東南西北四個(gè)區(qū)域,北部的門店ID分別為3,5,6,9,17。東部的門店ID分別為1,2,10,11,19,20。西部的門店ID分別為4,12,13,14,18。南部的門店ID分別為7,8,15,16。每一個(gè)區(qū)域?qū)?yīng)一個(gè)分區(qū),則列表分區(qū)的SQL聲明如下:
與范圍分區(qū)不同,列表分區(qū)中沒(méi)用類似“MAXVALUE”這種用法,我們必須覆蓋所有可能的值。如果插入一個(gè)store_id為21的記錄,則系統(tǒng)將會(huì)報(bào)錯(cuò)。
哈希分區(qū)
哈希分區(qū)的設(shè)置很簡(jiǎn)單,只需保證用戶指定的表達(dá)式為正整數(shù),并且顯式設(shè)置分區(qū)個(gè)數(shù)即可。分區(qū)個(gè)數(shù)也需為正整數(shù)。如下所示:
YEAR(hired)為用戶設(shè)置的表達(dá)式,返回正整數(shù)。需要注意的是表達(dá)式的結(jié)果值與指定的列值最好成線性關(guān)系,否則,分區(qū)的數(shù)據(jù)將不能均勻的分布。如果要確認(rèn)某個(gè)記錄分布在哪個(gè)分區(qū),可以使用N
= MOD(expr, num)的公式進(jìn)行確認(rèn)。MOD為取模,N為記錄所在的分區(qū),expr為YEAR(hired)的值,num為4
(根據(jù)上例的值所得)。那么如果expr的值為2005,則記錄所在的分區(qū)為第一分區(qū)。
線性哈希分區(qū)
線性哈希分區(qū)與普通哈希分區(qū)在確定記錄所在分區(qū)的算法上有一定區(qū)別,其它并無(wú)不同之處,線性哈希分區(qū)的SQL聲明如下所示:
關(guān)鍵字分區(qū)
關(guān)鍵字分區(qū)需以表中的主鍵或唯一列來(lái)作為分區(qū)的關(guān)鍵字指定,否則將不能成功設(shè)置。關(guān)鍵字分區(qū)的SQL聲明如下:
可以看到,關(guān)鍵字的類型并不一定是需要正整數(shù),字符型的列也可以作為關(guān)鍵字。
除以上介紹的分區(qū)外,MySQL還能設(shè)置列分區(qū)與子分區(qū)。那么,什么是列分區(qū),什么是子分區(qū)呢?下面我們簡(jiǎn)單的了解下。
子分區(qū),子分區(qū)就是分區(qū)下的分區(qū),將每個(gè)分區(qū)繼續(xù)細(xì)分,變成更小的分區(qū)。有這種需求的,可能是單表數(shù)據(jù)量非常大的場(chǎng)景吧。具體的設(shè)置方式如下所示:
此聲明將ts表按范圍分成p0,p1,p2三個(gè)分區(qū),又將p0,p1,p2每個(gè)分區(qū)用哈希分區(qū)分成了p0-1和p0-2(p1,p2以此類推)兩個(gè)子分區(qū)。實(shí)際上,此聲明是將表分成了6個(gè)分區(qū)。
還有更加詳細(xì)的子分區(qū)法,如下所示:
此聲明首先利用范圍分區(qū)將表分成了p0,p1,p2三個(gè)分區(qū),然后利用哈希分區(qū)將p0細(xì)分為s0,s1兩個(gè)分區(qū),s0的數(shù)據(jù)文件路徑為/disk0/data,索引文件路徑為/disk0/idx,以此類推。最后的分區(qū)為s0,s1,s2,s3,s4,s5。
列分區(qū)
列分區(qū)就是利用多個(gè)列值進(jìn)行分區(qū),范圍分區(qū)與列表分區(qū)都支持列分區(qū)。列分區(qū)不支持表達(dá)式,只支持列名,但列名可以是多個(gè)。列分區(qū)是通過(guò)比較多個(gè)列值形成的元組進(jìn)行分區(qū)。下面我們范圍列分區(qū)來(lái)介紹下列分區(qū),SQL聲明如下:
此聲明依據(jù)a,d,c三列進(jìn)行范圍分區(qū)。通過(guò)比較(5,10,’ggg’),(10,20,’mmmm’),(15,30,’sss’)來(lái)對(duì)表中的數(shù)據(jù)進(jìn)行分割。由于對(duì)于元組的范圍判斷本人也不是太清楚,保證不了分區(qū)的完備性原則,所以這里就不詳細(xì)介紹列分區(qū)了。對(duì)列分區(qū)有興趣的同學(xué)可以自行查看手冊(cè)。
關(guān)于MySQL的分區(qū)今天就先聊到這,具體使用哪種類型的分區(qū),分多少區(qū)還要看各位的具體應(yīng)用場(chǎng)景和應(yīng)用邏輯來(lái)決定,不能一概而論。
總結(jié)
以上是生活随笔為你收集整理的mf怎么使mysql信息分区_细聊MySQL的分区功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mac mysql-python 失败_
- 下一篇: mysql自动生成日期序列号_mysql