基于Hash算法的Mysql分表處理
下面為您介紹的Mysql分表處理是基于Hash算法的,在了解該Mysql分表處理方法之前,讓我們先來(lái)了解一下Hash算法。
我們知道Hash表就是通過某個(gè)特殊的Hash算法計(jì)算出的一個(gè)值,這個(gè)值必須是惟一的,并且能夠使用這個(gè)計(jì)算出來(lái)的值查找到需要的值,這個(gè)叫做哈希表。
我們?cè)诜直砝锏膆ash算法跟這個(gè)思想類似:通過一個(gè)原始目標(biāo)的ID或者名稱通過一定的hash算法計(jì)算出數(shù)據(jù)存儲(chǔ)表的表名,然后訪問相應(yīng)的表。
繼續(xù)拿上面的貼吧來(lái)說,每個(gè)貼吧有版塊名稱和版塊ID,那么這兩項(xiàng)值是固定的,并且是惟一的,那么我們就可以考慮通過對(duì)這兩項(xiàng)值中的一項(xiàng)進(jìn)行一些運(yùn)算得出一個(gè)目標(biāo)表的名稱。
現(xiàn)在假如我們針對(duì)我們這個(gè)貼吧系統(tǒng),假設(shè)系統(tǒng)***允許1億條數(shù)據(jù),考慮每個(gè)表保存100萬(wàn)條記錄,那么整個(gè)系統(tǒng)就不超過100個(gè)表就能夠容納。按照這個(gè)標(biāo)準(zhǔn),我們假設(shè)在貼吧的版塊ID上進(jìn)行hash,獲得一個(gè)key值,這個(gè)值就是我們的表名,然后訪問相應(yīng)的表。
我們構(gòu)造一個(gè)簡(jiǎn)單的hash算法:
function get_hash($id){
$str = bin2hex($id);
$hash = substr($str, 0, 4);
if (strlen($hash)<4){
$hash = str_pad($hash, 4, "0");
}
return $hash;
}
算法大致就是傳入一個(gè)版塊ID值,然后函數(shù)返回一個(gè)4位的字符串,如果字符串長(zhǎng)度不夠,使用0進(jìn)行補(bǔ)全。
比如:get_hash(1),輸出的結(jié)果是“3100”,輸入:get_hash(23819),得到的結(jié)果是:3233,那么我們經(jīng)過簡(jiǎn)單的跟表前綴組合,就能夠訪問這個(gè)表了。那么我們需要訪問ID為1的內(nèi)容時(shí)候哦,組合的表將是:topic_3100、reply_3100,那么就可以直接對(duì)目標(biāo)表進(jìn)行訪問了。
當(dāng)然,使用hash算法后,有部分?jǐn)?shù)據(jù)是可能在同一個(gè)表的,這一點(diǎn)跟hash表不同,hash表是盡量解決沖突,我們這里不需要,當(dāng)然同樣需要預(yù)測(cè)和分析表數(shù)據(jù)可能保存的表名。
如果需要存儲(chǔ)的數(shù)據(jù)更多,同樣的,可以對(duì)版塊的名字進(jìn)行hash操作,比如也是上面的二進(jìn)制轉(zhuǎn)換成十六進(jìn)制,因?yàn)闈h字比數(shù)字和字母要多很多,那么重復(fù)幾率更小,但是可能組合成的表就更多了,相應(yīng)就必須考慮一些其它的問題。
歸根結(jié)底,使用hash方式的話必須選擇一個(gè)好的hash算法,才能生成更多的表,然數(shù)據(jù)查詢的更迅速。
【編輯推薦】