日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MySql,Sql Server分区技术浅析

發布時間:2023/12/31 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySql,Sql Server分区技术浅析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.MySql ? ?

? ?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語句如下:

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 ))(

……

) ?

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


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數據庫的分區表就創建完成了。。。


今天先寫到這里,以后在對分區表進行深入的研究。

轉載于:https://blog.51cto.com/tongling/1244812

總結

以上是生活随笔為你收集整理的MySql,Sql Server分区技术浅析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。