MySql,Sql Server分区技术浅析
一.MySql ? ?
? ?MySql在5.1以后的版本中加入了分區(qū)技術,其不同于以往的分表技術,之前的分表技術是把一張大的表水平(按照一定的邏輯)分成多張表,比如如果我們的User表中有1000萬條數(shù)據(jù),那如果放在一張表里面去查詢,絕對是坑爹的行為,更別提再去進行增刪改。如果在加上索引,撐爆內(nèi)存是難免的。所以才有了之后的分表技術,比如把用戶名是a開頭的用戶放入一張表里面,這樣可以減少該表的數(shù)據(jù)量 ,但是同樣這個在應用層上也需要對系統(tǒng)進行優(yōu)化,比如當我查詢“abc”這個用戶時,我知道他的信息在user1這個表里,然后與之對應的select語句就要發(fā)生相應的變化。當然進行水平分表時也不一定僅僅按照用戶名的首字母來匹配對應相應的存儲表,應根據(jù)信息得不同建立相應的邏輯對應關系。發(fā)現(xiàn)自己扯得有點遠……。咱們回過頭來說一下MySql5.1版本之后的的分區(qū)技術,不過還要提一下之前的分表技術,多大表進行拆分后,其相應的子表(暫且這么稱呼)在邏輯上是變化的,這就體現(xiàn)在我們查詢sql語句的不同上,那有沒有一種技術可以在邏輯上保持原狀,僅僅在物理結構上發(fā)生變化吶?這就是我們要提到的MySql的分區(qū)技術。對應用程序而言,他還是一張表,這樣可以在邏輯層上屏蔽我們之前遇到的復雜查詢語句。
MySql5.1上有5種分區(qū)類型,下面就讓我們一個個的來瞅瞅看:
1)RANGE分區(qū)(經(jīng)常使用):
基于屬于一個給定連續(xù)區(qū)間的列值,把多個行分配給分區(qū); ? ?
例:假定你創(chuàng)建了一個如下表,該表保存了20家音像店的職員記錄,這20家音像店的編號從1到20,你想把不同時期離職的職員的信息分別存儲,那么你可以將字段separated(即離職時間)作為一個Key,則sql語句如下:
PARTITION BYRANGE(YEAR(Separated ))(
……
) ?
就是根據(jù)Separate進行分組,上面代碼表示離職年份在1991之前數(shù)據(jù)的存儲在S0表中,其余的一次類推,相信以各位的智商應該能夠看得懂。
2)LIST分區(qū)(一般使用):
類似于RANGE分區(qū),但是屬于RANGE的一個特例,是基于列值匹配一個離散集合重的某個值來進行選擇的,再清楚一點就是當表中列里的值是固定值時(性別:男,女)而且是枚舉類型時,此時適合使用LIST分區(qū);
例:假定你創(chuàng)建了一個如下的一個表,該表保存了20家音像店的職員記錄,而這20家音像店分布在4個有經(jīng)銷權的地方,如下表:
地區(qū) | 商店ID號 |
北區(qū) | 3,5,6,9,17 |
東區(qū) | 1,2,10,11,19,20 |
西區(qū) | 4,12,13,14,18 |
中心區(qū) | 7,8,15,16 |
則LIST分區(qū)語句為:
相信大家都看得懂,不做過多的解釋。
3)HASH分區(qū)(較少使用)
基于用戶定義的表達式的返回值來進行選擇的分區(qū),該表達式使用將要插入到表中的那些行的列值進行計算,這個函數(shù)可以包含MySql重的有效的、產(chǎn)生非負整數(shù)值的任何表達式。其要根據(jù)該表所處的環(huán)境來衡量是否可用于該表,也就是在預先確定數(shù)目的分區(qū)中平均分布。
例:還是上面的那種表,那么現(xiàn)在我想把不同時期入職的員工分別進行存儲,那我可以將日期字段Hired作為一個Key,sql語句如下:
CREATE TABLE Employees(Id INT NOT NULL,Fname VARCHAR(30),Iname VARCHAR(30),Hired DATE NOT NULL DEFAULT ‘1990-01-01’,Separated DATE NOT NULL DEFAULT ‘9999-12-31’,Job_CODE INT,Store_ID INT ) PARTITION BY HASH(YEAR(Hired)) PARTITIONS 4 ;也就是說根據(jù)Hired這個字段把數(shù)據(jù)平均分配到4個不同分區(qū)表中。注意:HASH中的值必須是整數(shù)所以使用到了YEAR函數(shù)。
4)KEY分區(qū)(很少使用)
類似于HASH分區(qū),區(qū)別在于KEY分區(qū)只提供計算一列或多列,且MySql服務器提供其自身的哈希函數(shù)。與HASH不同的是它的Key可以不是整數(shù)類型,可以是字符串等字段,該分區(qū)使用不多,而且效率有些折扣,在此不再舉例;
二.Sql Server
Sql Server在2005之后的版本引入的特性。這個特性允許邏輯上的表在物理上分成多個部分,之前所謂的分區(qū)表僅僅是分布式視圖,也就是多個表做union視圖,而真正的分區(qū)表是邏輯上一個表,物理上多個表,原理跟MySql分區(qū)表的概念基本一致。有一點值得注意的是分區(qū)函數(shù)并不具體屬于分區(qū)架構和分區(qū)表,他們之間僅僅屬于使用關系。
1).定義分區(qū)表首先要定義分區(qū)函數(shù),例如:
該函數(shù)把時間分成了3個區(qū)域,2010-01-01之前是一個區(qū)域,2010-01-01~2012-01-01是一個區(qū)域,剩下的是一個區(qū)域。
2).定義分區(qū)架構
定義完分區(qū)函數(shù)僅僅是到了如何將列的值區(qū)分到不同的分區(qū)中,而每個分區(qū)的存儲方式則需要分區(qū)架構來定義,分區(qū)架構負責分配每個區(qū)屬于那個文件組,而分區(qū)函數(shù)是決定了如何在邏輯上分區(qū)
3).定義分區(qū)表
這個就不用過多解釋了,就是我們的邏輯表,只不過顯示當中都是某張表夠大的時候才考慮采用分區(qū)表,但是當我們在剛剛建立時需要指定相關的特性,示例代碼:
CREATE TABLE PTable( ID INT, ORDERID INT, SALESDATE DATE ) ON schemeForPartition(SALESDATE) --schemeForPartition指定分區(qū)架構根據(jù)的Key為SALESDATE就創(chuàng)建完成了
這樣Sql Server數(shù)據(jù)庫的分區(qū)表就創(chuàng)建完成了。。。
今天先寫到這里,以后在對分區(qū)表進行深入的研究。
轉載于:https://blog.51cto.com/tongling/1244812
總結
以上是生活随笔為你收集整理的MySql,Sql Server分区技术浅析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 台币标志
- 下一篇: ping不通win7、8解决方法以及nc