- 客戶端與連接層的優化:調整客戶端DB連接池的參數和DB連接層的參數。
- MySQL結構的優化:合理的設計庫表結構,表中字段根據業務選擇合適的數據類型、索引。
- MySQL參數優化:調整參數的默認值,根據業務將各類參數調整到合適的大小。
- 整體架構優化:引入中間件減輕數據庫壓力,優化MySQL架構提高可用性。
- 編碼層優化:根據庫表結構、索引結構優化業務SQL語句,提高索引命中率。
帶來的性能收益排序為 4 > 2 > 5 > 3 > 1,性能收益越大意味著成本越高。
MySQL 連接層優化策略
一個用戶請求在Java程序中分配一條線程處理,然后變成一條SQL發往MySQL執行,Java程序和MySQL-Server之間通過建立網絡連接進行通信,這些連接稱為數據庫連接,MySQL內部也是通過一條條線程執行SQL語句。數據庫連接數不是越大越好。
數據庫連接數越大,內部創建出的工作線程會越多,需要的CPU配置就更高,線程數量超過服務器CPU核心數量,CPU會以時間片調度模式工作,在不同線程中反復切換執行,這個過程遠大于線程執行的開銷。
連接池分為客戶端連接池、服務端連接池,客戶端連接池是指Java自身維護的數據庫連接對象,如C3P0、DBCP、Druid、HikariCP...等連接池。服務端連接池是指MySQL-Server的連接層中,自身維護的一個連接池,用來實現線程復用的目的。
重點調整的是客戶端連接池的連接數,MySQL實例一般情況下只為單個項目提供服務,應用程序的連接數做了限制,也就限制了服務端的連接數。但數據庫實例不僅僅只為單個項目提供服務,有時候通過終端工具遠程連接MySQL,MySQL的最大連接數和客戶端連接池的最大連接數保持一致,很有可能導致MySQL連接數爆滿,最終造成終端無法連上MySQL。
客戶端的連接池大小計算公式:最大連接數 = (CPU核心數 * 2) + 有效磁盤數(SSD固態硬盤)
1. 偶發高峰類業務的連接數配置
在某個時間段流量顯然比平時高很多的業務,這類業務常駐線程數不適合太多。并發來臨時會創建大量連接,并發后一直保持數據庫連接會導致資源被占用。這類業務最大連接數按上面的公式配置,常駐連接數可配成CPU核數+1,同時縮短連接存活時間來即使釋放空閑的數據庫連接。
2. 分庫分表情況下的連接數配置
以上提到的都是建立在單庫情況下的配置,對于讀寫分離、雙主雙寫、分庫分表的情況下,就不適合這樣配置。因為部署了多個MySQL節點,意味著擁有墮胎服務器的硬件資源,要根據每個節點的硬件配置規劃處合理的連接數。
總結:
連接層的調優實際上是指調整它的參數,即常駐連接數、最大連接數、空閑連接存活時間以及等待隊列的容量。對于最佳連接數的計算,首先要把CPU核數放首位考慮,緊接著是磁盤,最后是網絡帶寬,因為帶寬會影響SQL執行時間,綜合考慮后計算出最合適的連接數大小。