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