mysql引數帶x MySQL引數優化案例

2021-10-20 22:59:44 字數 2807 閱讀 7860

環境介紹

硬體配置

cpu核心數

記憶體大小

磁碟空間

16核256g

3t軟體環境

作業系統版本

mysql版本

表數目單錶行數

centos-7.4

mysql-5.7.22

128張表

2kw行

優化層級與指導思想

優化層級

mysql資料庫優化可以在多個不同的層級進行,層級的常見分法有1):sql優化 2):引數優化 3):架構優化;本文重點關注第2層,並通過一次完整的優化案例來講解引數優化的內在邏輯。

指導思想

1、日誌先行 -- 乙個事務能否成功提交的關鍵是與它相關的日誌是否成功落盤,與資料沒有太大的關係;也就是說對寫的優化可以表述為各方面的資源向寫操作傾斜。

2、瓶頸分析 -- 通過show global status 的各個計數器的值基本上就能分析出當前瓶頸所在,再結合一些簡單的系統層面的監控工具如top iostat 等通常就能明確瓶頸。

3、整體效能是「讀」&「寫」之間的再平衡。

優化過程

最小化安裝情況下的效能表現

my.cnf中的內容

監控資料

分析&優化思路

對監控資料有兩種可能的解釋:1): 由於最小化的安裝的buffer_pool_size比較小,所以會頻繁的觸發innodb_buffer_pool的最大髒頁的限制,使得innodb進入爆力刷盤的模式,這種情況下io使用率會明顯上公升。2): redo日誌重用。 最終的影響可能是兩者的疊加,這裡先從buffer_pool開始優化。

優化innodb_buffer_pool_size

my.cnf中的內容

監控資料

調整innodb_buffer_pool_size前後的效能對比

分析&優化思路

1、針對innob_buffer_pool_size的調整取得了一定的收穫,下面將要調整的就是針對redo重用的情況了,也就是說我們要增大innodb_log_files_in_group和innodb_log_file_size到乙個合適的值。

2、innob_buffer_pool_size的調整取得了一定的收穫還可以更進一步,那就是增大innodb_buffer_pool_instances的值。

優化innodb_log_files_in_group&innodb_log_file_size

根據對之前測試的記錄每完成一組測試lsn增大4.5g、持續時間大概是5分鐘;理論上把redo檔案增大到5g可以做到整個測試的過程中不發生日誌重用、這樣的話測試的跑分會更高,不過這個會影響資料庫宕機恢復的時間。mysql在預設配置下innodb_log_files_in_group=2,innodb_log_file_size=48m也就是說跑完一組測試redo日誌要重新整理48輪(1024*4.5/96 ==48) 先看一下把日誌重新整理調整到9輪的情況。

my.cnf中的內容

調整innodb_log_files_in_group&innodb_log_file_size前後的效能對比

現在看一下日誌重用控制在一輪(5g)之內的效能表現

my.cnf中的內容

分析&優化思路

1、增大redo到5g的情況下由於整個測試過程中幾乎沒有日誌檔案重用的問題,這樣也就規避由些引發的大量資料刷盤行為,所以效能曲線也就更平滑了。

2、通過show global status 發現table_open_cache_overflows=200w+、thread_created=2k+

3、%cpus : 80.5 us, 13.8 sy, 0.0 ni, 5.4 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st 95%的使用率cpu資源成了大問題,這個使用率下能調整的引數不多了

3、對磁碟的監控資料表明util的峰值已經下降到14%、磁碟已經不在是問題;所以針對innodb_buffer_pool_size、innodb_log_files_in_group&innodb_log_file_size 這兩次優化的進入一步優化innodb_buffer_pool_instances、innodb_log_buffer_size 先不進行;在些採用「抓大放小」的方式先調整表快取。

優化table_open_cache&table_open_cache_instances&innodb_sync_spin_loops&thread_cache_size

由於cpu使用率達到了95%看到這個數值有一種發自內心的無力感,所以打算所目前status中能明確的一些問題直接一起調整了;增大table_open_cache&table_open_cache_instances用於優化表快取、增大thread_cache_size使用cpu不用頻繁的建立消毀執行緒、增大innodb_sync_spin_loops是希望盡可能的避免上下文切換(由於目前的監控粒度不是特別細所以無法給出13.8%中有多少是上下文切換)也就是說增大innodb_sync_spin_loops更多的是出於職業判斷

my.cnf中的內容

總結考慮到cpu使用率已經達到95%且增加物理cpu不現實的情況下,決定mysql引數優化到些為止了;最後來看一眼這次優化成果。

vue route 帶引數 vue 路由傳參

v router的注意事項 使用name和params組合傳參 this.router.push 注釋 路由的配置 import vue from vue import router from vue router vue.use router export default new router 獲...

mysql帶參儲存過程小例子

儲存過程p get class name是根據輸入的班級號判斷班級名稱 儲存過程p insert student是接收輸入的學生資訊,最終將資訊插入學生表。sql view plain copy print?drop procedure if exists p get class name crea...

mysql的url引數 mysql url引數

mysql url格式如下 jdbc mysql host port host port database 引數名1 引數值1 引數名2 引數值2 mysql在高版本需要指明是否進行ssl連線 在url後面加上 usessl true 常用的幾個較為重要的引數 引數名稱 引數說明 user 資料庫使...