溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

mysql中怎么實(shí)現(xiàn)水平切分

發(fā)布時(shí)間:2021-08-04 16:50:57 來(lái)源:億速云 閱讀:163 作者:Leah 欄目:數(shù)據(jù)庫(kù)

今天就跟大家聊聊有關(guān)mysql中怎么實(shí)現(xiàn)水平切分,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

方法一:使用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)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI