資料庫高併發解決方法總結

石志遠發表於2018-11-15

[TOC]

前言

一個專案剛開始的時候是為了實現基本功能,隨著版本和功能的迭代,大資料和高併發成了軟體設計必須考慮的問題!

本質很簡單,一個是慢,一個是等。

兩者是相互關聯的,因為慢,所以要等,因為等,所以慢,解決了慢,也就解決了等,解決了等,也就解決了慢。

關鍵是如何解決慢和等,

核心 一個是短一個是少一個是分流,最後一個是叢集/橫向擴張/讀寫分離/建立主從

是指路徑要短

  1. 頁面靜態化- 使用者可以直接獲取頁面,不用走那麼多流程,比較適用於頁面不頻繁更新。
  2. 使用快取– 第一次獲取資料從資料庫準提取,然後儲存在快取中,以後就可以直接從快取提取資料。不過需要有機制維持快取和資料庫的一致性。
  3. 使用儲存過程-那些處理一次請求需要多次訪問資料庫的操作,可以把操作整合到儲存過程,這樣只要一次資料庫訪問就可以了。
  4. 批量讀取 – 高併發情況下,可以把多個請求的查詢合併到一次進行,以減少資料庫的訪問次數
  5. 延遲修改 – 高併發情況下,可以把多次修改請求,先儲存在快取中,然後定時將快取中的資料儲存到資料庫中,風險是可能會斷電丟失快取中的資料,
  6. 使用索引 – 索引可以看作是特殊的快取,儘量使用索引就要求where字句中精確的給出索引列的值。

是指查詢的資料要少:

  1. 分表 – 把本來同一張表的內容,可以按照地區,類別等分成多張表,很簡單的一個思路,但是要儘量避免分出來的多表關聯查詢。
  2. 分離活躍資料 – 例如登入使用者業務,註冊使用者很多,但是活躍的登入使用者很少,可以把活躍使用者專門儲存一張表,查詢是先查詢活躍表,沒有的話再查總表,這也類似與快取啦。
  3. 分塊 – 資料庫層面的優化,對程式是透明的,查詢大資料只用找到相應塊就行。

分流

  1. 叢集 – 將併發請求分配到不同的伺服器上,可以是業務伺服器,也可以是資料庫伺服器。
  2. 分散式 – 分散式是把單次請求的多項業務邏輯分配到多個伺服器上,這樣可以同步處理很多邏輯,一般使用與特別複雜的業務請求。
  3. CDN – 在域名解析層面的分流,例如將華南地區的使用者請求分配到華南的伺服器,華中地區的使用者請求分配到華中的伺服器。
  4. 分庫分表 –

    水平拆分【分表】:

    對於訪問極為頻繁且資料量巨大的單表來說,首先要做的是減少單表的記錄條數,以便減少資料查詢所需的時間,提高資料庫的吞吐,這就是所謂的分表【水平拆分】

    垂直拆分【分庫】:

    是根據業務耦合性,將關聯度低的不同表儲存在不同的資料庫上,對資料庫進行拆分,從而提高資料庫寫入能力,即分庫【垂直拆分】

  1. 建立主從 – 讀寫分離就是隻在主伺服器上寫,只在從伺服器上讀,基本原理是讓主資料庫處理事務性查詢,而從資料庫處理select查詢,資料庫複製被用於把事務性查詢(增刪改)導致的改變更新同步到叢集中的從資料庫。

相關文章