INNODB引擎 分割槽表(二)

2021-10-06 18:52:21 字數 2492 閱讀 8110

hash分割槽的目的就是將資料盡量均勻地分布在各個分割槽中。在range和list分割槽中,需要指定範圍,而在hash分割槽中,mysql會自動安排完成這些工作。使用者需要做的就是對要進行hash分割槽的列值指定乙個列值或者表示式,以及指定將要被分成的區塊數。

對乙個表進行hash分割槽,首先需要在create table語句上加上乙個partition by

hash(expr),其中expr代表乙個返回整數的表示式,也可以是乙個整數列。此外還需要加上partition num 子句,其中num為非負的整數,表示將要被分割成的正整數。如果沒有partition num,則預設分成乙個分割槽。

示例:create table b(

id  int,

b  datetime

)partition by hash(year(b))

partitions 4;

示例資料:『2010-09-01』

select mod(year('2010-09-01'),4);

通過mod函式來判斷具體插入的分割槽:mod(year(『2010-09-01』))=2,因此』2010-09-01』這條資料就會存到p2分割槽。

針對日期這種資料本身可是離散的,因此hash分割槽並不一定能夠保證均勻地分布到各區。但是如果是一些連續的資料,hash分割槽則能保證比較均勻地分布到各區。

key分割槽和hash分割槽類似,只不過hash分割槽的分割槽值可以為表示式,而key裡的只能是整數列。key分割槽使用的是mysql內部自己的函式,對於innodb引擎來說,這個內部函式也就是hash函式。

示例:create table b(

id  int,

b  datetime

)partition by key(b)

partitions 4;

之前介紹的四種分割槽:range、list、hash、key,分割槽的值都需要是整數列。如果不是整型,則需要通過函式轉換為整數。在mysql5.5版本後,開始支援columns分割槽,可認為是range和list的進化,columns分割槽可以直接使用非整數型字段,分割槽根據型別直接比較而得,不需要轉換成整數型。此外,range還支援了多列組合分割槽。

columns支援分割槽的列型別:

□ 所有的整型型別,如int、smallint、tinyint、bigint。float和decimal則不予支援。

□ 日期型別,如date和datetime。其餘的日期型別不予支援。

□ 字串型別,如char、varchar、binary和varbinary。blob和text型別不予支援。

示例:range多列分割槽

create table b_1(

id  int,

b  datetime,

c  char(3)

)partition by range columns(b,c)(

partition p1 values less than ('2009-09-01','cc'),

partition p2 values less than ('2009-10-01','gg')

);對於多列分割槽,從前往後判斷,滿足乙個,即加入該分割槽。

子分割槽是在分割槽的基礎,在進行分割槽。有時也稱為復合分割槽。

子分割槽建立需要注意以下幾個問題:

□ 每個子分割槽的數量必須相同。

□ 要在乙個分割槽表的任何分割槽上使用subpartition來明確定義任何子分割槽,就必須定義所有的子分割槽,下面這種就是錯誤定義:

□ 每個subpartition子句必須包括子分割槽的乙個名字

□ 子分割槽的名字必須是唯一的。因此下面的建立語句是錯誤的:

range分割槽中,null值會分到最左側的分割槽

list分割槽,需要特殊指定null值得分割槽,否則插入會報錯

hash和key分割槽,函式值都預設返回為0。

對於一張表來說,不一定分割槽會帶來查詢速度的上公升,反而可能造成速度的下降。

對於olap,我們可能會需要頻繁的去掃瞄一張很大的資料表,如果對這張表的時間戳字段加個分割槽,那麼我們獲取某一時間段的資料的查詢效率會大大提高。

然而對於oltp的應用,分割槽應該非常小心。在這種應用下,通常不可能會獲取一張大表中10%的資料,大部分都是通過索引返回幾條記錄即可。而根據b+樹索引的原理可知,對於一張大表,一般的b+樹需要2~3次的磁碟io。因此b+樹可以很好地完成操作,不需要分割槽的幫助,並且設計不好的分割槽會帶來嚴重的效能問題。

具體就是如果我們頻繁操作的表,經常查詢的字段做分割槽會給我們帶來效率的提高,但是如果使用別的欄位來做查詢,這樣分割槽不但沒有起到加速的效果,反而我們會對每個分割槽的資料都進行查詢,io次數則可能是原來一張表io次數的分割槽數倍。從而查詢效率會降低很多。

把非分割槽表改為分割槽表

把非分割槽表改為分割槽表 說明 把非分割槽表改為分割槽表適用於歷史表 1 建立分割槽表 結構和非分割槽表tbl stock balance log相同 createtabletbl stock balance log part1 account id varchar2 20 byte occur d...

sqlserver 分割槽表

1 建分割槽函式,用於自動劃分物理表資料的流向 建好後可以在databases dbname storage中看到 下面分成四個區域 bigscreen且 computer且 pooltable 若是right,則x1 bigscreen x2 computer x3 pooltable x4 若是...

GPT 分割槽表

guid 分割槽表 gpt 一種由基於 itanium 計算機中的可擴充套件韌體介面 efi 使用的磁碟分割槽架構。與主啟動記錄 mbr 分割槽方法相比,gpt 具有更多的優點,因為它允許每個 磁碟有多達 128 個分割槽,支援高達 18 千兆兆位元組的卷大小,允許將主磁碟分割槽表和備份磁碟分割槽表...