今天就跟大家聊聊有關(guān)MySQL中怎么實現(xiàn)水平切分,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
目前創(chuàng)新互聯(lián)公司已為成百上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計、冠縣網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
方法一:使用MD5哈希
做法是對UID進(jìn)行md5加密,然后取前幾位(我們這里取前兩位),然后就可以將不同的UID哈希到不同的用戶表(user_xx)中了。
Php代碼
function getTable( $uid ){
$ext = substr ( md5($uid) ,0 ,2 );
return "user_".$ext;
}
通過這個技巧,我們可以將不同的UID分散到256中用戶表中,分別是user_00,user_01 …… user_ff。因為UID是數(shù)字且遞增,根據(jù)md5的算法,可以將用戶數(shù)據(jù)幾乎很均勻的分別到不同的user表中。
但是這里有個問題是,如果我們的系統(tǒng)的用戶越來越多,勢必單張表的數(shù)據(jù)量越來越大,而且根據(jù)這種算法無法擴(kuò)展表,這又會回到文章開頭出現(xiàn)的問題了。
方法二:使用移位
具體方法是:
Php代碼
public function getTable( $uid ) {
return "user_" . sprintf( "%04d", ($uid >> 20) );
}
這里,我們將uid向右移動20位,這樣我們就可以把大約前100萬的用戶數(shù)據(jù)放在第一個表user_0000,第二個100萬的用戶數(shù)據(jù)放在 第二個表user_0001中,這樣一直下去,如果我們的用戶越來越多,直接添加用戶表就行了。由于我們保留的表后綴是四位,這里我們可以添加1萬張用戶 表,即user_0000,user_0001 ……
user_9999。一萬張表,每張表100萬數(shù)據(jù),我們可以存100億條用戶記錄。當(dāng)然,如果你的用戶數(shù)據(jù)比這還多,也不要緊,你只要改變保 留表后綴來增加可以擴(kuò)展的表就行了,如如果有1000億條數(shù)據(jù),每個表存100萬,那么你需要10萬張表,我們只要保留表后綴為6位即可。
上面的算法還可以寫的靈活點:
Php代碼
/**
* 根據(jù)UID分表算法
* @param int $uid //用戶ID
* @param int $bit //表后綴保留幾位
* @param int $seed //向右移動位數(shù)
*/
function getTable( $uid , $bit , $seed ){
return "user_" . sprintf( "%0{$bit}d" , ($uid >> $seed) );
}
總結(jié):
上面兩種方法,都要對我們當(dāng)前系統(tǒng)的用戶數(shù)據(jù)量做出可能最大的預(yù)估,并且對數(shù)據(jù)庫單個表的最大承受量做出預(yù)估。
比如第二種方案,如果我們預(yù)估我們系統(tǒng)的用戶是100億,單張表的最優(yōu)數(shù)據(jù)量是100萬,那么我們就需要將UID移動20來確保每個表是100萬的數(shù)據(jù),保留用戶表(user_xxxx)四位來擴(kuò)展1萬張表。
又如第一種方案,每張表100萬,md5后取前兩位,就只能有256張表了,系統(tǒng)總數(shù)據(jù)庫就是:256*100萬;如果你系統(tǒng)的總數(shù)據(jù)量的比這還多,那你實現(xiàn)肯定要MD5取前三位或者四位甚至更多位了。
看完上述內(nèi)容,你們對mysql中怎么實現(xiàn)水平切分有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
本文名稱:mysql中怎么實現(xiàn)水平切分
本文來源:http://www.rwnh.cn/article48/jicphp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、搜索引擎優(yōu)化、企業(yè)網(wǎng)站制作、營銷型網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)