你知道MySQL是如何處理千萬級數據的嗎?

mysql 分表思路

你知道MySQL是如何處理千萬級數據的嗎?

一張一億的訂單表,可以分成五張表,這樣每張表就只有兩千萬數據,分擔了原來一張表的壓力,分表需要根據某個條件進行分,這裡可以根據地區來分表,需要一箇中間件來控制到底是去哪張表去找到自己想要的數據。

中間件:根據主表的自增 id 作為中間件(什麼樣的字段適合做中間件?要具備唯一性)

怎麼分發?主表插入之後返回一個 id,根據這個 id 和表的數量進行取模,餘數是幾就往哪張表中插入數據。

注意:子表中的 id 要與主表的 id 保持一致

以後只有插入操作會用到主表,修改,刪除,讀取,均不需要用到主表

你知道MySQL是如何處理千萬級數據的嗎?

redis 消息隊列

  1. 什麼是消息隊列?
    答:消息傳播過程中保存消息的容器
  2. 消息隊列產生的歷史原因
    答:主要原因是由於在高併發環境下,由於來不及同步處理,請求往往會發生堵塞,比如說,大量的insert,update之類的請求同時到達MySQL,直接導致無數的行鎖表鎖,甚至最後請求會堆積過多,從而觸發併發錯誤。通過使用消息隊列,我們可以異步處理請求,從而緩解系統的壓力。

消息隊列的特點: 先進先出

把要執行的 sql 語句先保存在消息隊列中,然後依次按照順利異步插入的數據庫中

應用: 新浪,把瞬間的評論先放入消息隊列,然後通過定時任務把消息隊列裡面的 sql 語句依次插入到數據庫中

修改

操作子表進行修改

你知道MySQL是如何處理千萬級數據的嗎?

這樣修改有一個問題,主表和子表的數據會出現不一致,如何讓主表和字表數據一致?

redis 隊列保持主表子表數據一致

修改完成後將要修改主表的數據,存入 redis 隊列中

你知道MySQL是如何處理千萬級數據的嗎?

然後 linux 定時任務(contble)循環執行 redis 隊列中的 sql 語句,同步更新主表的內容

你知道MySQL是如何處理千萬級數據的嗎?

mysql 分佈式之分表(查,刪)

查詢只需要查詢子表,不要查詢總表

你知道MySQL是如何處理千萬級數據的嗎?

刪除,先根據 id 找到要刪除的子表,然後刪除,然後往消息隊列中壓入一條刪除總表數據的 sql 語句

然後執行定時任務刪除總表數據

你知道MySQL是如何處理千萬級數據的嗎?

定時任務:

你知道MySQL是如何處理千萬級數據的嗎?

mysql 分佈式之分庫

分庫思路

  1. 單庫單表
    單庫單表是最常見的數據庫設計,例如,有一張用戶(user)表房子啊數據庫db中,所有的用戶都是可以在db庫中的user表中查到。
  2. 單庫多表
    隨著用戶數量的增加,user表的數據量會越來越大,當數據量達到一定程度的時候對user表的查詢會漸漸的變慢,從而影響整個DB的性能。可以通過某種方式將user進行水平的切分,產生兩個表結構完全一樣的user_0000,user-0001等表,user_0000 + user-0001 + …的數據剛好是一份完整的數據。
  3. 多庫多表
    隨著數據量增加也許單臺DB的存儲空間不夠,隨著查詢量的增加單臺數據庫服務器已經沒辦法支撐。這個時候可以再對數據庫進行水平區分。

分庫原理圖:

你知道MySQL是如何處理千萬級數據的嗎?

你知道MySQL是如何處理千萬級數據的嗎?

mysql 分佈式之分庫(增)

你知道MySQL是如何處理千萬級數據的嗎?

注意:操作完一個數據庫一定要把數據庫連接關閉,不然 mysql 會以為一直連接的同一個數據庫

還是取模確定加載哪個配置文件連接哪個數據庫

你知道MySQL是如何處理千萬級數據的嗎?

mysql 分佈式之分庫(改)

原理同新增

你知道MySQL是如何處理千萬級數據的嗎?

mysql 分佈式之分庫(查,刪)

原理類似

你知道MySQL是如何處理千萬級數據的嗎?

刪除

你知道MySQL是如何處理千萬級數據的嗎?

執行隊列

mysql 分佈式之緩存(memcache)的應用

將數據放入緩存中,節省數據庫開銷,先去緩存中查,如果有直接取出,如果沒有,去數據庫查,然後存入緩存中

你知道MySQL是如何處理千萬級數據的嗎?

在編輯信息之後需要刪除緩存,不然一直讀取的是緩存的數據而不是修改過的數據

你知道MySQL是如何處理千萬級數據的嗎?


分享到:


相關文章: