重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
今天就跟大家聊聊有關(guān)MySQL中怎么實(shí)現(xiàn)水平切分,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
目前創(chuàng)新互聯(lián)公司已為成百上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、冠縣網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
方法一:使用MD5哈希
做法是對(duì)UID進(jìn)行md5加密,然后取前幾位(我們這里取前兩位),然后就可以將不同的UID哈希到不同的用戶(hù)表(user_xx)中了。
Php代碼
function getTable( $uid ){
$ext = substr ( md5($uid) ,0 ,2 );
return "user_".$ext;
}
通過(guò)這個(gè)技巧,我們可以將不同的UID分散到256中用戶(hù)表中,分別是user_00,user_01 …… user_ff。因?yàn)閁ID是數(shù)字且遞增,根據(jù)md5的算法,可以將用戶(hù)數(shù)據(jù)幾乎很均勻的分別到不同的user表中。
但是這里有個(gè)問(wèn)題是,如果我們的系統(tǒng)的用戶(hù)越來(lái)越多,勢(shì)必單張表的數(shù)據(jù)量越來(lái)越大,而且根據(jù)這種算法無(wú)法擴(kuò)展表,這又會(huì)回到文章開(kāi)頭出現(xiàn)的問(wèn)題了。
方法二:使用移位
具體方法是:
Php代碼
public function getTable( $uid ) {
return "user_" . sprintf( "%04d", ($uid >> 20) );
}
這里,我們將uid向右移動(dòng)20位,這樣我們就可以把大約前100萬(wàn)的用戶(hù)數(shù)據(jù)放在第一個(gè)表user_0000,第二個(gè)100萬(wàn)的用戶(hù)數(shù)據(jù)放在 第二個(gè)表user_0001中,這樣一直下去,如果我們的用戶(hù)越來(lái)越多,直接添加用戶(hù)表就行了。由于我們保留的表后綴是四位,這里我們可以添加1萬(wàn)張用戶(hù) 表,即user_0000,user_0001 ……
user_9999。一萬(wàn)張表,每張表100萬(wàn)數(shù)據(jù),我們可以存100億條用戶(hù)記錄。當(dāng)然,如果你的用戶(hù)數(shù)據(jù)比這還多,也不要緊,你只要改變保 留表后綴來(lái)增加可以擴(kuò)展的表就行了,如如果有1000億條數(shù)據(jù),每個(gè)表存100萬(wàn),那么你需要10萬(wàn)張表,我們只要保留表后綴為6位即可。
上面的算法還可以寫(xiě)的靈活點(diǎn):
Php代碼
/**
* 根據(jù)UID分表算法
* @param int $uid //用戶(hù)ID
* @param int $bit //表后綴保留幾位
* @param int $seed //向右移動(dòng)位數(shù)
*/
function getTable( $uid , $bit , $seed ){
return "user_" . sprintf( "%0{$bit}d" , ($uid >> $seed) );
}
總結(jié):
上面兩種方法,都要對(duì)我們當(dāng)前系統(tǒng)的用戶(hù)數(shù)據(jù)量做出可能最大的預(yù)估,并且對(duì)數(shù)據(jù)庫(kù)單個(gè)表的最大承受量做出預(yù)估。
比如第二種方案,如果我們預(yù)估我們系統(tǒng)的用戶(hù)是100億,單張表的最優(yōu)數(shù)據(jù)量是100萬(wàn),那么我們就需要將UID移動(dòng)20來(lái)確保每個(gè)表是100萬(wàn)的數(shù)據(jù),保留用戶(hù)表(user_xxxx)四位來(lái)擴(kuò)展1萬(wàn)張表。
又如第一種方案,每張表100萬(wàn),md5后取前兩位,就只能有256張表了,系統(tǒng)總數(shù)據(jù)庫(kù)就是:256*100萬(wàn);如果你系統(tǒng)的總數(shù)據(jù)量的比這還多,那你實(shí)現(xiàn)肯定要MD5取前三位或者四位甚至更多位了。
看完上述內(nèi)容,你們對(duì)mysql中怎么實(shí)現(xiàn)水平切分有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。