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分區中。
說明: 如果將要分區的表有一個唯一的鍵,那么用來作為 HASH 用戶函數的自變數或者主鍵的 column_list 的自變數的任意列都必須是那個鍵的一部分。
下面試一下,字符串列是否可以作為hash分區的列,按照上面的討論和說明,我們認為是不行的,因為hash的計算本質是mod運算,必須是整數。實驗如下:
實驗證明:hash的分區必須是整數列。
可以通過下面的命令,進行重新分區:
alter table hash_partition_tbl partition by hash(a) partitions 4;
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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