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

mysql 分表思路

在這裏插入圖片描述
一張一億的訂單表,能夠分紅五張表,這樣每張表就只有兩千萬數據,分擔了原來一張表的壓力,分表須要根據某個條件進行分,這裏能夠根據地區來分表,須要一箇中間件來控制究竟是去哪張表去找到本身想要的數據。mysql

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

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

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

之後只有插入操做會用到主表,修改,刪除,讀取,均不須要用到主表
在這裏插入圖片描述sql

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架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)

相關文章
相關標籤/搜索