MySQL是如何處理千萬級數據


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)的應用

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

在這里插入圖片描述
在編輯信息之后需要刪除緩存,不然一直讀取的是緩存的數據而不是修改過的數據
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM