解決數據庫高併發的常見方案:
1) 緩存式的 Web 應用程序架構:html
在 Web 層和 DB(數據庫)層之間加一層 cache 層,主要目的:減小數據庫讀取負擔,提升數 據讀取速度。cache 存取的媒介是內存,能夠考慮採用分佈式的 cache 層,這樣更容易破除內存容量 的限制,同時增長了靈活性。數據庫
2) 增長 Redis 緩存數據庫:緩存
把常常訪問到的數據並且不須要常常變化的數據放在緩存中。服務器
主要針對於數據與用戶無直接關聯,寫少讀多的數據,使用緩存來減小數據庫的壓力。架構
第一獲取數據從數據庫中提取,而後保存在緩存中,之後就能夠直接從緩存中加載數據,須要有機制維持緩存和數據庫的一致性。併發
3) 增長數據庫索引:負載均衡
索引能夠看做是特殊的緩存,儘可能使用索引就要求where字句中精確的給出索引列的值。異步
4) 頁面靜態化:分佈式
效率最高、消耗最小的就是純靜態化的 html 頁面,因此咱們儘量使咱們的網站上的頁面採 用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。用戶能夠直接獲取頁面,不用像 MVC 結構走那麼多流程,比較適用於頁面信息大量被前臺程序調用,可是更新頻率很小的狀況。高併發
5) 使用存儲過程:
處理一次請求須要屢次訪問數據庫的操做,能夠把操做整合到儲存過程,這樣只要一次數據庫訪問就能夠了。
6) MySQL 主從讀寫分離:
當數據庫的寫壓力增長,cache 層(如 Memcached)只能緩解數據庫的讀取壓力。讀寫集 中在一個數據庫上讓數據庫不堪重負。使用主從複製技術(master-slave 模式)來達到讀寫分離,以 提升讀寫性能和讀庫的可擴展性。讀寫分離就是隻在主服務器上寫,只在從服務器上讀,基本原理是 讓主數據庫處理事務性查詢,而從數據庫處理 select 查詢,數據庫複製被用於把事務性查詢(增刪改) 致使的改變動新同步到集羣中的從數據庫。
MySQL 讀寫分離提高系統性能:
一、主從只負責各自的讀和寫,極大程度緩解 X 鎖和 S 鎖爭用。
二、slave 能夠配置 MyISAM 引擎,提高查詢性能以及節約系統開銷。
三、master 直接寫是併發的,slave 經過主庫發送來的 binlog 恢復數據是異步的。
四、slave 能夠單獨設置一些參數來提高其讀的性能。
五、增長冗餘,提升可用性。
實現主從分離可使用 MySQL 中間件如:Atlas
7) 分表分庫:
在 cache 層的高速緩存,MySQL 的主從複製,讀寫分離的基礎上,這時 MySQL 主庫的寫 壓力開始出現瓶頸,而數據量的持續猛增,因爲 MyISAM 使用表鎖,在高併發下會出現嚴重的鎖問 題,大量的高併發 MySQL 應用開始使用 InnoDB 引擎代替 MyISAM。採用 Master-Slave 複製模式 的 MySQL 架構,只能對數據庫的讀進行擴展,而對數據的寫操做仍是集中在 Master 上。這時須要 對數據庫的吞吐能力進一步地擴展,以知足高併發訪問與海量數據存儲的需求。
對於訪問極爲頻繁且數據量巨大的單表來講,首先要作的是減小單表的記錄條數,以便減小 數據查詢所需的時間,提升數據庫的吞吐,這就是所謂的分表【水平拆分】。在分表以前,首先須要 選擇適當的分表策略(儘可能避免分出來的多表關聯查詢),使得數據可以較爲均衡地分佈到多張表中, 而且不影響正常的查詢。
分表可以解決單表數據量過大帶來的查詢效率降低的問題,可是卻沒法給數據庫的併發處理 能力帶來質的提高。面對高併發的讀寫訪問,當數據庫 master 服務器沒法承載寫操做壓力時,無論 如何擴展 Slave 服務器都是沒有意義的,對數據庫進行拆分,從而提升數據庫寫入能力,即分庫【垂直拆分】。
8) 負載均衡集羣:
將大量的併發請求分擔到多個處理節點。因爲單個處理節點的故障不影響整個服務,負載均衡集羣同時也實現了高可用性。
負載均衡將是大型網站解決高負荷訪問和大量併發請求採用的終極解決辦法。