PHP+MySQL 千萬級資料處理案例(一)

huxiaobai_001發表於2020-04-12

廢話少說 直接進入場景
一個金融公司有500w投資使用者,每天充值投資50w筆,那麼該公司每年將近有1億條充值記錄,那麼我們改如何處理這個充值訂單表的資料呢?難不成都放一張表裡面,那萬一哪天我讓你去統計滿足某個需求的記錄,1億條資料裡面檢索你會累死mysql的!今天我們就來講述一下如何去處理這種情況。

mysql分散式之分表思路
分表不是隨隨便便就分表,必須要結合專案的實際情況,比如我們的專案的瓶頸在哪裡,區區幾千幾萬幾十萬或者幾百萬的資料用分表那就是高射炮打蚊子了,不要盲目的分表!必須要達到一定的數量級,並且影響了我們的使用者的訪問速度,效能下降的情況下才能考慮去做分表處理!
我們來畫個簡單的不能再簡單的圖吧,我喜歡畫圖

分表的思路就是如此簡單,藉助中介軟體可以根據不同省份的訂單插入到不同省份對應的表當中去,當然實際當中還得要結合自身的業務來尋找製作這個中介軟體,不要照搬人家的邏輯思路!
就比如12306當年總是奔潰一樣,全國這麼多條鐵路線路,在早上八點同時放出搶票,幾億人去搶,再牛逼的技術也很難抵擋,當然阿里很牛逼哈,當時就很多人為他們出謀劃策,提供各種方案,說什麼人家淘寶天貓京東都這麼搞的,他媽的又不瞭解人家12306的實際業務很多人瞎逼逼,後來12306不也是採用分發的這種形式,錯峰釋出各個鐵路班線的搶票,緩解了大流量帶來的巨大沖擊,所以一定要結合自身實際的業務去做各種方案,就跟這裡的中介軟體一樣!不廢話了!

mysql分散式之分表實戰

//虛擬碼
//假設使用者資料入庫 定為每天50w的資料量入庫
//我們建立一張使用者主表+兩張使用者分表  使用者分表user0 使用者分表user1
//首先所有使用者資料入使用者主表
$sql = insert into users(a,b,c) values($a,$b,$c);
$res = $model->query($sql);
if($res){
    //獲取user主表插入的最後一條sql的id
    $insert_id = $model->getLastInsId();
    //對剛才入庫成功的記錄的id取模 如果你是兩種使用者分表那麼就%2如果是200張那麼就%200
    $d = $insert_id%2;
    //取模之後 獲取到最後的模 任何數對2取模那麼不是0就是1 任何數對200取模那麼模就是0到200之間
    //插入到不同的使用者分表當中去
    $_sql = insert into user{$d} (a,b,c) values($a,$b,$c);
    $ru = $model->query($_sql);
}

其實我們是利用了取模的形式做了一箇中介軟體的功能,根據模的數值去往不同的user0還有user1當中插入資料,達到了分發的效果
整個過程user主表一定是先插入資料的,然後根據模再去往不同的分表裡面插資料;
需要強調的是user分表裡面的user_id主鍵一定不是自增的,一定是根據user主表裡面的id來插入的,必須保證和主表裡面的主鍵id保持一致!
需要強調的是user主表和user0 user1分表一定是欄位屬性相同的直接複製即可,只是把資料分發到不同的表裡面去了,這也叫水平分表!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

胡軍

相關文章