雜湊分割槽最主要的用法是用來保證資料的平均分布。使用範圍分割槽和列表分割槽時必須顯示地定義分割槽值或者值列表;但是使用雜湊分割槽時,我們只需要對列值或者基於列值的表示式進行雜湊運算,就可以進行分割槽了。
在進行雜湊分割槽是,我們需要在create table
語句後加上partition by hash(expr)
,expr是乙個返回整型的表示式。更簡單的,我們可以往hash()
裡傳遞乙個列名,這個列的型別必須是mysql中的整型型別。另外,我們可以在語句後面加上乙個partitions num
來顯示的指定分割槽底層表的數量,num必須是乙個整型數字。
在下面的例子中,我們建立乙個分割槽表,用store_id
列進行雜湊分割槽,分成4個底層表:
create table employees (
id int not null,
fname varchar(30),
lname varchar(30),
hired date not null default '1970-01-01',
separated date not null default '9999-12-31',
job_code int,
store_id int
)partition by hash(store_id)
partitions 4;
如果不指定partitions
, 預設為底層表的數量為1.如果不給partitions
指定數量,會導致乙個語法錯誤。
我們也可以使用返回整型的sql表示式。例如,我們希望對員工按年進行分割槽:
create table employees (
id int not null,
fname varchar(30),
lname varchar(30),
hired date not null default '1970-01-01',
separated date not null default '9999-12-31',
job_code int,
store_id int
)partition by hash( year(hired) )
partitions 4;
expr的返回值必須是非常量、非隨機的整型,也就是說這個返回值必須是不同的但是又具有確定性的乙個整型數值,不能包含分割槽約束和限制的結構。當每次修改或者插入資料時,都會對這個表示式求值(刪除也有可能);這就意味著,當現實中我們執行批註裡操作時,複雜的表示式可能會引起效能問題。
當對單個列進行雜湊分割槽時,這個列的值是按正序或者倒序排列的,這中雜湊分割槽的效率會比較高。表示式使用的列值變化幅度越小,mysql使用這個表示式進行雜湊分割槽的效率越高。
例如,date_col
列的型別是date
, 表示式to_days(date_col)
會隨著date_col
列值的變化而變化,因為date_col
列值的每乙個變化,都會引起表示式以一致的方式變化。year(date_col)
的變化則不會像to_days(date_col)
那麼大,因為不是每個date_col
可能的變化都會導致year(date_col)
產生不一樣的結果。所以year(date_col)
是乙個好的分割槽候選。
假設我們有乙個int型別的列int_col
, 表示式pow(5-int_col, 3) + 6
就不是乙個好的分割槽表示式。原因是int_col
列的沒乙個變化都會引起表示式大範圍的變化。
使用雜湊分割槽時,mysql通過對表示式的值進行n = mod(expr, num)
運算來決定使用num個分割槽中的第n個分割槽。假設表t1
分成4個分割槽:
create table t1 (col1 int, col2 char(5), col3 date)
partition by hash( year(col3) )
partitions 4;
現在我們往t1
裡插入資料,其中col3
的值為2005-09-15
,分割槽的判斷是這樣的:
mod(year('2005-09-01'),4)
= mod(2005,4)
= 1
MySQL分割槽表
分割槽表是一種粗粒度,簡易的索引策略,適用於大資料的過濾場景.最適合的場景是,沒有合適的索引時,對其中幾個分割槽表進行全表掃瞄.或者只有乙個分割槽表和索引是熱點,而且這個分割槽和索引能夠全部儲存在記憶體中.限制單錶分割槽數不要超過150個,並且注意某些導致無法做分割槽過濾的細節,分割槽表對於單條記錄...
mysql分割槽表
對使用者來說,分割槽表是乙個獨立的邏輯表,但是底層由多個物理子表組成。實現分割槽的 實際上是對一組底層表的控制代碼物件的封裝。mysql在建立表時使用partition by子句定義每個分割槽存放的資料。在執行查詢的時候,優化器會根據分割槽定義過濾那些沒有我們需要資料的分割槽,這樣查詢就無須掃瞄所有...
mysql分割槽表 MySQL分割槽表的正確使用方法
mysql分割槽表概述 我們經常遇到一張表裡面儲存了上億甚至過十億的記錄,這些表裡面儲存了大量的歷史記錄。對於這些歷史資料的清理是乙個非常頭疼事情,由於所有的資料都乙個普通的表裡。所以只能是啟用乙個或多個帶where條件的delete語句去刪除 一般where條件是時間 這對資料庫的造成了很大壓力。...