1. 程式人生 > 其它 >mysql Innodb引數配置

mysql Innodb引數配置

技術標籤:mysql

前言

作為mysql底層最重要的元件,瞭解Innodb的原理並掌握其基本的引數配置對於mysql效能調優具有非常重要的作用

下面結合工作中和Innodb部分常用的引數配置進行說明

1、innodb_buffer_pool_size

該引數表示mysql 的Innodb儲存引擎為優化查詢效能而開闢出的一塊記憶體緩衝區

show global VARIABLES like 'innodb_buffer_pool_size'

在這裡插入圖片描述
換算成M就是128M,即Innodb引擎預設開闢了128M的空間作為優化查詢效能使用,需要將這個和query cache區別開來,兩者是在不同的層級上進行優化的

在理解這個引數時,需要結合下面幾個引數一起理解,

Innodb已使用的快取 “頁Page”的數量

show global status like ‘innodb_buffer_pool_pages_data’

innodb在讀取資料從磁碟到記憶體時是以Page為單位進行讀取的
在這裡插入圖片描述
Innodb全部快取頁的數量

show global status like ‘innodb_buffer_pool_pages_total’;

在這裡插入圖片描述
Innodb快取頁的每一頁的長度

show global status like ‘Innodb_page_size’

在這裡插入圖片描述
頁面使用率

result = innodb_buffer_pool_pages_data / innodb_buffer_pool_pages_total * 100%

可以利用這個結果作為mysql伺服器優化的參考指標

  • result > 95%,考慮增大 innodb_buffer_pool_size ,建議使用實體記憶體的75%
  • result < 95%,考慮減小 innodb_buffer_pool_size ,建議設定為:innodb_buffer_pool_pages_data * Innodb_page_size * 1.05 (MB)

如果修改innodb_buffer_pool_size,使用如下命令即可:

set global innodb_buffer_pool_size = XXX

2、innodb_flush_log_at_trx_commit

控制Innodb事務日誌寫入的過程

在事務控制中,存在“事務區”來保證事務的完整性,在事務提交成功以後,這些事務區的資料會寫入到硬碟上,同時事務操作日誌(log)也需要向硬碟中寫入,這個引數就是用來控制何時寫入日誌資料的

該引數有3個等級,分別為0,1,2

  • 0:log buffer 將每秒一次的寫入log file中,在模式在事務提交的時候,不會主動觸發寫入磁碟的操作
  • 1:每次事務提交的時候,mysql都會把log buffer的資料寫入到 log file,並且做flush操作(刷到磁碟),該模式為系統預設
  • 2:每次事務提交的時候都會把 log buffer的資料寫入到log file,但是flush(刷到磁碟)的操作並不會同時進行,在該模式下,mysql會每秒執行一次flush的操作

三種模式下的資料安全性比較:

  • 當設定為0時,速度最快,但不太安全,如果mysql程序崩潰會導致上一秒的所有事務資料丟失【適用於高併發場景下對於事務日誌資料的讀寫不是很敏感的場景】
  • 設定為1時,該模式是最安全的,但也是最慢的一種方式,在mysql服務程序崩潰或者主機宕掉時,最多丟失一個語句或者事務【適用於強事務的業務操作】
  • 當設定為2時,該模式速度較快,相對0時也安全,在程序崩潰或者宕機時,上一秒的所有事務資料才會丟失

注意:對於事務的操作比較頻繁的業務操作中,需要特別關注這個引數的配置,在實際測試時發現,該引數的設定對於插入資料的速度影響非常大,設為2的時候插入10000條資料需要2秒,設定為0的時候只需要1秒,設定為1的時候,則需要200多秒,因此,mysql官方運維手冊也建議儘量將插入操作合併為一個事務,即將眾多的小事務合併,以便可以大幅度提升速度

3、innodb_doublewrite

雙寫操作,即同一份資料寫2份,保證資料存在一個副本,預防資料因為物理介質的儲存因素造成資料丟失(預設開啟)

show global variables like ‘innodb_doublewrite’;

在這裡插入圖片描述
4、innodb_file_per_table=1

設定獨立的表空間檔案,在儲存上看到的那些 xxx.idb檔案,通過設定這個引數,可以讓Innodb引擎對於表的資料維護性更好,同時也更方便後續對錶的資料拆分與遷移
在這裡插入圖片描述
5、innodb_thread_concurrency

設定Innodb執行緒的併發數,預設值為0時表示不被限制(即可以建立任意多個執行緒來處理請求),若要設定最好與伺服器的CPU核心數相同或者CPU核心數的2倍,以最大化的提升Innodb的使用效率

show global variables like ‘innodb_thread_concurrency’;

在這裡插入圖片描述
這個引數在實際開發中建議可以根據自身的伺服器好好配置下引數,以便提升併發環境下的mysql伺服器的利用率