在大中型專案中,在資料庫設計的時候,考慮到資料庫最大承受資料量,通常會把資料庫或者資料表水平切分,以降低單個庫,單個表的壓力。我這裡介紹兩個我們專案中常用的資料表切分方法。當然這些方法都是在程式中使用一定的技巧來路由到具體的表的。首先我們要確認根據什麼來水平切分?在我們的系統(sns)中,使用者的uid貫穿系統,唯一自增長,根據這個字段分表,再好不過。
方法一:使用md5雜湊
做法是對uid進行md5加密,然後取前幾位(我們這裡取前兩位),然後就可以將不同的uid雜湊到不同的使用者表(user_xx)中了。
function
gettable
( $uid )
通過這個技巧,我們可以將不同的uid分散到256中使用者表中,分別是user_00,user_01 …… user_ff。因為uid是數字且遞增,根據md5的演算法,可以將使用者資料幾乎很均勻的分別到不同的user表中。
但是這裡有個問題是,如果我們的系統的使用者越來越多,勢必單張表的資料量越來越大,而且根據這種演算法無法擴充套件表,這又會回到文章開頭出現的問題了。
方法二:使用移位
具體方法是:
public
function
gettable
( $uid )
這裡,我們將uid向右移動20位,這樣我們就可以把大約前100萬的使用者資料放在第乙個表user_0000,第二個100萬的使用者資料放在第二個表user_0001中,這樣一直下去,如果我們的使用者越來越多,直接新增使用者表就行了。由於我們保留的表字尾是四位,這裡我們可以新增1萬張使用者表,即user_0000,user_0001 …… user_9999。一萬張表,每張表100萬資料,我們可以存100億條使用者記錄。當然,如果你的使用者資料比這還多,也不要緊,你只要改變保留表字尾來增加可以擴充套件的表就行了,如如果有1000億條資料,每個表存100萬,那麼你需要10萬張表,我們只要保留表字尾為6位即可。
上面的演算法還可以寫的靈活點:
/**
* 根據uid分表演算法
* * @param
int$uid //使用者id
* @param
int$bit //表字尾保留幾位
* @param
int$seed //向右移動位數
*/function gettable( $uid , $bit , $seed )d" , ($uid >> $seed) );
}
總結:
上面兩種方法,都要對我們當前系統的使用者資料量做出可能最大的預估,並且對資料庫單個表的最大承受量做出預估。
比如第二種方案,如果我們預估我們系統的使用者是100億,單張表的最優資料量是100萬,那麼我們就需要將uid移動20來確保每個表是100萬的資料,保留使用者表(user_***x)四位來擴充套件1萬張表。
又如第一種方案,每張表100萬,md5後取前兩位,就只能有256張表了,系統總資料庫就是:256*100萬;如果你系統的總資料量的比這還多,那你實現肯定要md5取前三位或者四位甚至更多位了。
兩種方法都是將資料水平切分到不同的表中,相對第一種方法,第二種方法更具擴充套件性。。。
Python處理千萬級資料
從別人的 裡找到要用的資料的原始資料自己做過濾 搗鼓了兩天覺得 太慢開始用pandas做處理 不得不說最大的感觸就是 pandas 以及numpy在一定程度上在還原matlab 比如matlab中利用邏輯值取數 元素的用法,pandas中有幾乎一樣的方法 test 同時pandas中有很多很好用的方...
資料庫亂碼解決方案
oracle 資料庫亂碼解決方案 你插入資料的時候,用 轉變字串的亂碼函式 param str return public string getstr string str catch exception e 向bean裡面賦值 public void setaction string action...
資料庫死鎖解決方案
一 活鎖 如果事務t1封鎖了資料r,事務t2又請求封鎖r,於是t2等待。t3也請求封鎖r,當t1釋放了r上的封鎖之後系統首先批准了t3的請求,t2仍然等待。然後t4又請求封鎖r,當t3釋放了r上的封鎖之後系統又批准了t4的請求,t2有可能永遠等待,這就是活鎖的情形。避免活鎖的簡單方法是採用先來先服務...