hash分割槽的目的是將資料按照某列進行hash計算後更加均勻的分散到各個分割槽,相比,range和list分割槽來說,hash分割槽不需要明確指定乙個給定的列值或者列值集合
應該在儲存在哪個分割槽,mysql會自動按照hash計算後完成這些工作,我們只需要基於將要進行hash的列值指定乙個列或者表示式,以及可選的指定要分割槽的表總的分割槽數量。
下面我們舉乙個例子來說,hash分割槽如何建立。首先我們建立如下的**:hash_partition_tbl,並插入幾條記錄到表中,如下所示:
我們也同時看一下,對應的表空間檔案是如何分布的(注意,我們已經設定了innodb_file_per_table=1,即每個表單獨乙個ibd檔案),我們在對應的datadir目錄下可以看到:
由於我們是分成4個hash區,因此可以看到四個表空間檔案,分別是hash_partition_tab#p#pi.ibd,i=0,1,2,3。
這裡的hash分割槽的確定按照如下規則:
mod(year(『2012-05-01』),4) = mod (2012,4) = 0, 在分割槽p0;
mod(year(『2016-05-01』),4) = mod (2016,4) = 0, 在分割槽p0;
mod(year(『2010-05-01』),4) = mod (2010,4) = 2, 在分割槽p2;
mod(year(『2011-05-01』),4) = mod (2011,4) = 3, 在分割槽p3;
因此,我們認為 p0有2個記錄,p2和p3分別有1個記錄,p1記錄數為0,那麼接下來我們通過查詢information_schema.partitions表來驗證。
之前我們知道range和list分割槽,如果表中存在primary key或者unique key,則對應分割槽的列必須是這些key的子集,那麼對hash是否有同樣的約束呢,字元型別的列是否可以作為hash分割槽?接下來我們立刻以實驗為基礎進行驗證。
首先把之前的分割槽先刪除掉,執行如下命令:
發現drop partition命令只能用在range和list分割槽中。
現在我們把a設定為unique key,如果成功,則說明hash分割槽允許非unique key 作為hash的列,執行如下:
說明:如果將要分割槽的表有乙個唯一的鍵,那麼用來作為hash使用者函式的自變數或者主鍵的column_list的自變數的任意列都必須是那個鍵的一部分。
下面試一下,字串列是否可以作為hash分割槽的列,按照上面的討論和說明,我們認為是不行的,因為hash的計算本質是mod運算,必須是整數。實驗如下:
實驗證明:hash的分割槽必須是整數列。
可以通過下面的命令,進行重新分割槽:
alter table hash_partition_tbl partition by hash(a) partitions 4;
mysql 分割槽 hash分割槽(四)
hash分割槽,分割槽字段必須是整型或者轉換為整型 hash分割槽主要用來分散熱點讀,確保資料在預先確定個數的分割槽中可能的平均分布。對乙個表執行hash分割槽時,mysql會對分割槽鍵應用乙個雜湊函式,以此確定資料應當放在n個分割槽中的哪個分割槽。mysql支援兩種hash分割槽 常規hash分割...
MySQL分割槽表 hash分割槽
雜湊分割槽最主要的用法是用來保證資料的平均分布。使用範圍分割槽和列表分割槽時必須顯示地定義分割槽值或者值列表 但是使用雜湊分割槽時,我們只需要對列值或者基於列值的表示式進行雜湊運算,就可以進行分割槽了。在進行雜湊分割槽是,我們需要在create table語句後加上partition by hash...
Mysql 分割槽介紹 六 HASH分割槽
hash分割槽是使用主鍵去確保資料均勻分布在乙個預先確定數字的分割槽上.在range 或list分割槽中.你必須顯式的指定給出的資料寫入哪個分割槽或設定乙個列值去儲存 在hash分割槽中.mysql已經為你準備的.你只需要指定乙個列的值或表示式基於列值去hash和分割槽的數字在哪個分割槽表中.cre...