你知道MySQL是如何處理千萬級資料的嗎?

it阿布發表於2020-08-10

mysql 分表思路

在這裡插入圖片描述
一張一億的訂單表,可以分成五張表,這樣每張表就只有兩千萬資料,分擔了原來一張表的壓力,分表需要根據某個條件進行分,這裡可以根據地區來分表,需要一箇中介軟體來控制到底是去哪張表去找到自己想要的資料。

中介軟體:根據主表的自增 id 作為中介軟體(什麼樣的欄位適合做中介軟體?要具備唯一性)

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

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

以後只有插入操作會用到主表,修改,刪除,讀取,均不需要用到主表
在這裡插入圖片描述

redis 訊息佇列

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

訊息佇列的特點: 先進先出

把要執行的 sql 語句先儲存在訊息佇列中,然後依次按照順利非同步插入的資料庫中

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

修改

操作子表進行修改

在這裡插入圖片描述

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

redis 佇列保持主表子表資料一致

修改完成後將要修改主表的資料,存入 redis 佇列中

在這裡插入圖片描述

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

在這裡插入圖片描述

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

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

在這裡插入圖片描述

刪除,先根據 id 找到要刪除的子表,然後刪除,然後往訊息佇列中壓入一條刪除總表資料的 sql 語句

然後執行定時任務刪除總表資料

在這裡插入圖片描述

定時任務:

在這裡插入圖片描述

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 分散式之快取(memcache)的應用

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

在這裡插入圖片描述
在編輯資訊之後需要刪除快取,不然一直讀取的是快取的資料而不是修改過的資料
在這裡插入圖片描述


 

更多學習內容可以訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)

相關文章