最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

實現(xiàn)數(shù)據(jù)庫水平切分的兩個思路

 更新時間:2019年03月19日 17:18:51   作者:CODETC  
今天小編就為大家分享一篇關于實現(xiàn)數(shù)據(jù)庫水平切分的兩個思路,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

引言

隨著互聯(lián)網(wǎng)應用的廣泛普及,海量數(shù)據(jù)的存儲和訪問成為了系統(tǒng)設計的瓶頸問題。對于一個大型的互聯(lián)網(wǎng)應用,每天幾十億的PV無疑對數(shù)據(jù)庫造成了相當高的負載。對于系統(tǒng)的穩(wěn)定性和擴展性造成了極大的問題。通過數(shù)據(jù)切分來提高網(wǎng)站性能,橫向擴展數(shù)據(jù)層已經成為架構研發(fā)人員首選的方式。

  • 水平切分數(shù)據(jù)庫:可以降低單臺機器的負載,同時最大限度的降低了宕機造成的損失;
  • 負載均衡策略:可以降低單臺機器的訪問負載,降低宕機的可能性;
  • 集群方案:解決了數(shù)據(jù)庫宕機帶來的單點數(shù)據(jù)庫不能訪問的問題;
  • 讀寫分離策略:最大限度了提高了應用中讀取數(shù)據(jù)的速度和并發(fā)量;

為什么要數(shù)據(jù)切分

上面對什么是數(shù)據(jù)切分做了個概要的描述和解釋,讀者可能會疑問,為什么需要數(shù)據(jù)切分呢?像Oracle這樣成熟穩(wěn)定的數(shù)據(jù)庫,足以支撐海量數(shù)據(jù)的存儲與查詢了?為什么還需要數(shù)據(jù)切片呢?

的確,Oracle的DB確實很成熟很穩(wěn)定,但是高昂的使用費用和高端的硬件支撐不是每一個公司能支付的起的。試想一下一年幾千萬的使用費用和動輒上千萬元的小型機作為硬件支撐,這是一般公司能支付的起的嗎?即使就是能支付的起,假如有更好的方案,有更廉價且水平擴展性能更好的方案,我們?yōu)槭裁床贿x擇呢?

我們知道每臺機器無論配置多么好它都有自身的物理上限,所以當我們應用已經能觸及或遠遠超出單臺機器的某個上限的時候,我們惟有尋找別的機器的幫助或者繼續(xù)升級的我們的硬件,但常見的方案還是橫向擴展,通過添加更多的機器來共同承擔壓力。我們還得考慮當我們的業(yè)務邏輯不斷增長,我們的機器能不能通過線性增長就能滿足需求?Sharding可以輕松的將計算,存儲,I/O并行分發(fā)到多臺機器上,這樣可以充分利用多臺機器各種處理能力,同時可以避免單點失敗,提供系統(tǒng)的可用性,進行很好的錯誤隔離。

綜合以上因素,數(shù)據(jù)切分是很有必要的。 我們用免費的MySQL和廉價的Server甚至是PC做集群,達到小型機+大型商業(yè)DB的效果,減少大量的資金投入,降低運營成本,何樂而不為呢?

在大中型項目中,在數(shù)據(jù)庫設計的時候,考慮到數(shù)據(jù)庫最大承受數(shù)據(jù)量,通常會把數(shù)據(jù)庫或者數(shù)據(jù)表水平切分,以降低單個庫,單個表的壓力。這里介紹兩個項目中常用的數(shù)據(jù)表切分方法。當然這些方法都是在程序中?使用一定的技巧來路由到具體的表的。首先我們要確認根據(jù)什么來水平切分?在我們的系統(tǒng)(SNS)中,用戶的UID貫穿系統(tǒng),唯一自增長,根據(jù)這個字段分表,再好不過。

方法一:使用MD5哈希

做法是對UID進行md5加密,然后取前幾位(我們這里取前兩位),然后就可以將不同的UID哈希到不同的用戶表(user_xx)中了。

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ù)這種算法無法擴展表,這又會回到文章開頭出現(xiàn)的問題了。

方法二:使用移位

具體方法是:

public function getTable( $uid ) {
 return "user_" . sprintf( "d", ($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億條用戶記錄。當然,如果你的用戶數(shù)據(jù)比這還多,也不要緊,你只要改變保留表后綴來增加可以擴展的表就行了,如如果有1000億條數(shù)據(jù),每個表存100萬,那么你需要10萬張表,我們只要保留表后綴為6位即可。

上面的算法還可以寫的靈活點:

/**
 * 根據(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) );
}

小結

上面兩種方法,都要對我們當前系統(tǒng)的用戶數(shù)據(jù)量做出可能最大的預估,并且對數(shù)據(jù)庫單個表的最大承受量做出預估。

比如第二種方案,如果我們預估我們系統(tǒng)的用戶是100億,單張表的最優(yōu)數(shù)據(jù)量是100萬,那么我們就需要將UID移動20來確保每個表是100萬的數(shù)據(jù),保留用戶表(user_xxxx)四位來擴展1萬張表。

又如第一種方案,每張表100萬,md5后取前兩位,就只能有256張表了,系統(tǒng)總數(shù)據(jù)庫就是:256*100萬;如果你系統(tǒng)的總數(shù)據(jù)量的比這還多,那你實現(xiàn)肯定要MD5取前三位或者四位甚至更多位了。

兩種方法都是將數(shù)據(jù)水平切分到不同的表中,相對第一種方法,第二種方法更具擴展性。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

相關文章

  • 解讀mysql刪除操作和查詢操作哪個更消耗性能

    解讀mysql刪除操作和查詢操作哪個更消耗性能

    文章討論了MySQL中刪除操作比查詢操作更消耗性能的原因,包括表級鎖定、磁盤空間浪費、索引稀疏化和事務日志膨脹,同時,文章還提出了一些減少刪除操作對性能影響的策略,如確保表上有合適的索引、分批次刪除和使用合適的WHERE條件
    2025-02-02
  • 安裝MySQL后include目錄下沒有找到libmysql.lib

    安裝MySQL后include目錄下沒有找到libmysql.lib

    安裝了MySQL后,在其安裝目錄下的include文件夾并沒有找到libmysql.lib,主要原因是在安裝MySQL的時候,沒有勾選develop component這一選項造成的
    2014-08-08
  • MySQL 獲得當前日期時間 函數(shù)

    MySQL 獲得當前日期時間 函數(shù)

    這篇文章主要介紹了MySQL 獲得當前日期時間 函數(shù) 非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-07-07
  • mysql全量備份、增量備份實現(xiàn)方法

    mysql全量備份、增量備份實現(xiàn)方法

    這篇文章主要介紹了mysql全量備份、增量備份實現(xiàn)方法,需要的朋友可以參考下
    2016-12-12
  • MySQL學習筆記5:修改表(alter table)

    MySQL學習筆記5:修改表(alter table)

    我們在創(chuàng)建表的過程中難免會考慮不周,因此后期會修改表修改表需要用到alter table修改表語句,接下來詳細介紹,需要的朋友可以參考下
    2013-01-01
  • 詳解數(shù)據(jù)庫語言中的null值

    詳解數(shù)據(jù)庫語言中的null值

    這篇文章主要詳解了數(shù)據(jù)庫語言中的null值,針對MySQL上的實例進行講解,需要的朋友可以參考下
    2015-04-04
  • 幾個比較重要的MySQL變量

    幾個比較重要的MySQL變量

    這篇文章主要介紹了幾個比較重要的MySQL變量,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • 解決windows下mysql8修改my.ini設置datadir后無法啟動問題

    解決windows下mysql8修改my.ini設置datadir后無法啟動問題

    在修改MySQL的my.ini文件以更改數(shù)據(jù)目錄后,可能會遇到無法啟動的問題,這通常是因為字符編碼被改變或新路徑權限不足,正確的做法是備份my.ini文件,確保使用ANSI字符編碼修改datadir,并確保新路徑有足夠的權限,特別是SYSTEM或NETWORKSERVICE權限
    2025-01-01
  • Mysql分組排序取每組第一條的2種實現(xiàn)方式

    Mysql分組排序取每組第一條的2種實現(xiàn)方式

    開發(fā)中經常會遇到,分組查詢最新數(shù)據(jù)的問題,下面這篇文章主要給大家介紹了關于Mysql分組排序取每組第一條的2種實現(xiàn)方式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • windows10安裝mysql5.7.18教程

    windows10安裝mysql5.7.18教程

    windows10安裝mysql5.7.18是這樣安裝的嗎?這篇文章主要為大家詳細介紹了win10下mysql5.7.18安裝配置方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04

最新評論

临潭县| 文登市| 伊吾县| 天祝| 乳山市| 平南县| 德庆县| 乌鲁木齐县| 华池县| 滦南县| 牙克石市| 岳阳市| 福建省| 阳西县| 福建省| 宜兰市| 米脂县| 共和县| 柳州市| 彰化县| 阳新县| 庆城县| 凤阳县| 前郭尔| 全州县| 乌拉特前旗| 张北县| 大英县| 叶城县| 林甸县| 辰溪县| 桃源县| 华安县| 砚山县| 自贡市| 平江县| 安丘市| 荆州市| 大关县| 内丘县| 祁门县|