1.根據硬件配置系統參數
wait_timeout 非交互連接的最大存活時間, 10-30min
max_connections 全局最大連接數 默認100 根據情況調整
back_log 達到max_connections后, 還能繼續接受的連接請求數, linux不超過1000, 根據情況調整
thread_concurrency MySQL處理線程數 cpu核心數*2
innodb_buffer_pool_size innodb引擎的數據頁大小, 一般是總內存的50%
innodb_flush_log_at_try_commit 將logbuffer寫入日志並flush進硬盤的時間點, 一般0(每秒)或者2(提交事務時)
innodb_log_buffer_size log緩存大小 1~8m
innodb_addtional_mem_pool_size 數據字典等數據結構的內存池大小 24~48m
innodb_thread_concurrency cpu核心數*2
2.hikariCP參數配置
maxLifetime 連接生命時長, 比mysql的wait_timeout短1分鍾左右
maximumPoolSize 連接池最大連接數: cpu核心數*2 + 硬盤數, 默認10 一個連接池一般來講連接數在10-20個, 根據部署的應用程序數量可以推測出mysql的max_connections值
readonly 是否是只讀數據源, 做讀寫分離時有用, 保證slave數據源的安全
connectionTimeout 等待連接池分配連接的最大時長 30s, 如果超過這個時間還沒有分配到連接, commit會拋異常
其他參數一般用默認即可
3.max_connections
show status like 'max%connections'
max_used_connections / max_connections 過去的最大連接數 / 設置的最大連接數, 應該在10%~80%, 可據此調整max_connections
4.wait_timeout
show processlist;
sleep 查看當前連接狀態, 如果sleep太多, 可以調小wait_timeout值
5.key_buffer_size優化
索引頁大小, 基礎設置256~512m
1>show global status like 'key_read%'
key_reads / key_read_request < 1 / 100
使用硬盤里的索引 / 所有索引請求 如果比例過大, 說明索引緩存不夠, 大量索引無法加入緩存, 只能從硬盤直接讀, 這是要適當調大key_buffer_size值
2>show global status like 'key_blocks_u%'
key_blocks_unused 未使用過的索引頁內存簇
key_blocks_used 使用過的索引頁內存簇
如果所有索引頁內存簇都被使用過, 說明索引頁內存使用較多, 可以適當調大key_buffer_size
6.query_cache查詢緩存
query_cache_size 查詢緩存大小 48~256m
query_cache_type 是否用查詢緩存 1
query_cache_limit 單次查詢緩存最大值 1~4m
query_cache_min_res_unit 緩存空間最小單位 4k
show global status like 'qcache%'
1> qcache_free_blocks / qcache_total_blocks < 20% 過大說明查詢的一般都是小數據量查詢, 可以適當減少query_cache_min_res_unit
2>qcache_free_memory / query_cache_size < 20% 過大說明大量查詢緩存未用, 可以適當減少query_cache_size
3>qcache_lowmem_prunes > 50說明內存碎片太多或者query_cache_size不夠
4>qcache_hits / qcache_hits_qcache_inserts 命中率低說明讀少寫多
7.table_cache 表緩存 256m
show global status like 'Open%tables'
open_table / table_cache 正在緩存中的表 過大說明表緩存被利用的很充分, 可以適當增加
opened_table / table_cache 緩存過的表
8.max_heap_table_size , tmp_table_size 內存臨時表大小限制, 由最小值決定
show global status like 'create_tmp%'
created_tmp_disk_tables / created_tmp_tables < 25% 過大說明由大量臨時表被創建在硬盤中, 這是要適當增加max_heap_table_size和tmp_table_size
9.thread_cache_size 緩存的線程數
show global status like 'Thread%'
Thread_created 過大表示創建線程數太頻繁, 可以增大thread_cache_size已緩存更多的線程
10.sort_buffer_size , record_rnd_buffer_size 排序緩存 , 隨機讀緩存
show global status like 'sort%'
sort_merge_passes 太大說明在硬盤中創建了很多臨時文件, 可以增大sort_buffer_size 和 record_rnd_buffer_size
11.慢查詢
1>show variables like '%slow%'
slow_launch_time 超過多長時間的查詢視為慢查詢 一般 2~5s
2>show global status like '%slow%'
slow_queries 慢查詢次數
3>show variables like '%log_query_file%'
slow_query_log 是否開啟了慢查詢日志
slow_query_log_file 慢查詢日志文件
12.表掃描
show global status like 'handler_read%'
show global status like 'com_select'
Handler_read_rnd_next / com_select > 4000 太大說明表掃描太多, 索引沒建好
13.表鎖使用
show global status like 'table_locks%'
Table_locks_immediate / Table_locks_waited > 5000 立即釋放的鎖 / 需要等待的鎖, 太大的話最好用Innodb, 用行級鎖替代立即釋放的表鎖