MySql,Sql Server分區技術淺析

一.MySql    sql

   MySql在5.1之後的版本中加入了分區技術,其不一樣於以往的分表技術,以前的分表技術是把一張大的表水平(按照必定的邏輯)分紅多張表,好比若是咱們的User表中有1000萬條數據,那若是放在一張表裏面去查詢,絕對是坑爹的行爲,更別提再去進行增刪改。若是在加上索引,撐爆內存是不免的。因此纔有了以後的分表技術,好比把用戶名是a開頭的用戶放入一張表裏面,這樣能夠減小該表的數據量 ,可是一樣這個在應用層上也須要對系統進行優化,好比當我查詢「abc」這個用戶時,我知道他的信息在user1這個表裏,而後與之對應的select語句就要發生相應的變化。固然進行水平分表時也不必定僅僅按照用戶名的首字母來匹配對應相應的存儲表,應根據信息得不一樣創建相應的邏輯對應關係。發現本身扯得有點遠……。我們回過頭來講一下MySql5.1版本以後的的分區技術,不過還要提一下以前的分表技術,多大表進行拆分後,其相應的子表(暫且這麼稱呼)在邏輯上是變化的,這就體如今咱們查詢sql語句的不一樣上,那有沒有一種技術能夠在邏輯上保持原狀,僅僅在物理結構上發生變化吶?這就是咱們要提到的MySql的分區技術。對應用程序而言,他仍是一張表,這樣能夠在邏輯層上屏蔽咱們以前遇到的複雜查詢語句。
數據庫

MySql5.1上有5種分區類型,下面就讓咱們一個個的來瞅瞅看:服務器

1)RANGE分區(常用):架構

基於屬於一個給定連續區間的列值,把多個行分配給分區;    分佈式

例:假定你建立了一個以下表,該表保存了20家音像店的職員記錄,這20家音像店的編號從1到20,你想把不一樣時期離職的職員的信息分別存儲,那麼你能夠將字段separated(即離職時間)做爲一個Key,則sql語句以下:
ide

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 RANGE(YEAR(Separated ))(
  PARTITION S0 VALUESLESS THAN(1991),
  PARTITION S1 VALUESLESS THAN(1996),
  PARTITION S2 VALUESLESS THAN(2001),
  PARTITION S3 VALUESLESS THAN MAXVALUE,
);

PARTITION BYRANGE(YEAR(Separated ))(函數

……優化

)   spa

就是根據Separate進行分組,上面代碼表示離職年份在1991以前數據的存儲在S0表中,其他的一次類推,相信以各位的智商應該可以看得懂code


2)LIST分區(通常使用):

相似於RANGE分區,可是屬於RANGE的一個特例,是基於列值匹配一個離散集合重的某個值來進行選擇的,再清楚一點就是當表中列裏的值是固定值時(性別:男,女)並且是枚舉類型時,此時適合使用LIST分區;

例:假定你建立了一個以下的一個表,該表保存了20家音像店的職員記錄,而這20家音像店分佈在4個有經銷權的地方,以下表:

地區

商店ID

北區

3,5,6,9,17

東區

1,2,10,11,19,20

西區

4,12,13,14,18

中心區

7,8,15,16

則LIST分區語句爲:

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 LIST(Store_ID)(
  PARTITION Snorth VALUESLESS IN(3,5,6,9,17),
  PARTITION Seast VALUESLESS IN(1,2,10,11,19,20),
  PARTITION Swest VALUESLESS IN(4.12.13.14.18),
  PARTITION Scentral VALUESLESS IN (7,8.15.16),
);

相信你們都看得懂,不作過多的解釋。

3)HASH分區(較少使用)

基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的那些行的列值進行計算,這個函數能夠包含MySql重的有效的、產生非負整數值的任何表達式。其要根據該表所處的環境來衡量是否可用於該表,也就是在預先肯定數目的分區中平均分佈。

例:仍是上面的那種表,那麼如今我想把不一樣時期入職的員工分別進行存儲,那我能夠將日期字段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
;

也就是說根據Hired這個字段把數據平均分配到4個不一樣分區表中。注意:HASH中的值必須是整數因此使用到了YEAR函數。

4)KEY分區(不多使用)

相似於HASH分區,區別在於KEY分區只提供計算一列或多列,且MySql服務器提供其自身的哈希函數。與HASH不一樣的是它的Key能夠不是整數類型,能夠是字符串等字段,該分區使用很少,並且效率有些折扣,在此再也不舉例;


二.Sql Server

Sql Server在2005以後的版本引入的特性。這個特性容許邏輯上的表在物理上分紅多個部分,以前所謂的分區表僅僅是分佈式視圖,也就是多個表作union視圖,而真正的分區表是邏輯上一個表,物理上多個表,原理跟MySql分區表的概念基本一致。有一點值得注意的是分區函數並不具體屬於分區架構和分區表,他們之間僅僅屬於使用關係。

1).定義分區表首先要定義分區函數,例如:


--建立分區函數
CREATE PARTITION FUNCTION fqPartition(DATE)
AS RANGE RIGHT
FOR VALUES('2010-01-01','2012-01-01')
--查看分區函數是否建立成功
Select * FROM SYS.PARTITION_FUNCTIONSGAI


該函數把時間分紅了3個區域,2010-01-01以前是一個區域,2010-01-01~2012-01-01是一個區域,剩下的是一個區域。

2).定義分區架構

定義完分區函數僅僅是到了如何將列的值區分到不一樣的分區中,而每一個分區的存儲方式則須要分區架構來定義,分區架構負責分配每一個區屬於那個文件組,而分區函數是決定了如何在邏輯上分區


--基於以前的分區函數建立分區架構
CREATE PARTITION SCHEME schemeForPartition
AS PARTITION fqPartition
--由於有3個區域,因此要指定3個文件組,也可使用all 全部的區域指向一個文件組,不過這樣沒有太多意義
TO (fileGroup0,fileGroup1,fileGroup2)
--查看已經創建的分區架構
select * from sys.partition_schemes

3).定義分區表

這個就不用過多解釋了,就是咱們的邏輯表,只不過顯示當中都是某張表夠大的時候才考慮採用分區表,可是當咱們在剛剛創建時須要指定相關的特性,示例代碼:

CREATE TABLE PTable(
ID INT,
ORDERID INT,
SALESDATE DATE
) ON schemeForPartition(SALESDATE)
--schemeForPartition指定分區架構根據的Key爲SALESDATE就建立完成了


這樣Sql Server數據庫的分區表就建立完成了。。。


今天先寫到這裏,之後在對分區表進行深刻的研究。

相關文章
相關標籤/搜索