MySQL調優基礎, 與hikari數據庫連接池配合


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, 用行級鎖替代立即釋放的表鎖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM