hash分區(qū)的目的是將數(shù)據(jù)按照某列進行hash計算后更加均勻的分散到各個分區(qū),相比,range和list分區(qū)來說,hash分區(qū)不需要明確指定一個給定的列值或者列值集合
應該在保存在哪個分區(qū),mysql會自動按照hash計算后完成這些工作,我們只需要基于將要進行hash的列值指定一個列或者表達式,以及可選的指定要分區(qū)的表總的分區(qū)數(shù)量。
下面我們舉一個例子來說,hash分區(qū)如何創(chuàng)建。首先我們創(chuàng)建如下的表格:hash_partition_tbl,并插入幾條記錄到表中,如下所示:
我們也同時看一下,對應的表空間文件是如何分布的(注意,我們已經(jīng)設置了innodb_file_per_table=1,即每個表單獨一個ibd文件),我們在對應的datadir目錄下可以看到:
由于我們是分成4個hash區(qū),因此可以看到四個表空間文件,分別是hash_partition_tab#p#pi.ibd,i=0,1,2,3。
這里的hash分區(qū)的確定按照如下規(guī)則:
mod(YEAR(‘2012-05-01’),4) = mod (2012,4) = 0, 在分區(qū)p0;
mod(YEAR(‘2016-05-01’),4) = mod (2016,4) = 0, 在分區(qū)p0;
mod(YEAR(‘2010-05-01’),4) = mod (2010,4) = 2, 在分區(qū)p2;
mod(YEAR(‘2011-05-01’),4) = mod (2011,4) = 3, 在分區(qū)p3;
因此,我們認為 p0有2個記錄,p2和p3分別有1個記錄,p1記錄數(shù)為0,那么接下來我們通過查詢information_schema.PARTITIONS表來驗證。
之前我們知道range和list分區(qū),如果表中存在primary key或者unique key,則對應分區(qū)的列必須是這些key的子集,那么對hash是否有同樣的約束呢,字符類型的列是否可以作為hash分區(qū)?接下來我們立刻以實驗為基礎進行驗證。
首先把之前的分區(qū)先刪除掉,執(zhí)行如下命令:
發(fā)現(xiàn)drop partition命令只能用在RANGE和LIST分區(qū)中。
說明: 如果將要分區(qū)的表有一個唯一的鍵,那么用來作為 HASH 用戶函數(shù)的自變數(shù)或者主鍵的 column_list 的自變數(shù)的任意列都必須是那個鍵的一部分。
下面試一下,字符串列是否可以作為hash分區(qū)的列,按照上面的討論和說明,我們認為是不行的,因為hash的計算本質(zhì)是mod運算,必須是整數(shù)。實驗如下:
實驗證明:hash的分區(qū)必須是整數(shù)列。
可以通過下面的命令,進行重新分區(qū):
alter table hash_partition_tbl partition by hash(a) partitions 4;
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
