作為mysql底層最重要的元件,了解Innodb的原理并掌握其基本的參數配置對于mysql性能調優具有非常重要的作用
下面結合工作中和Innodb部分常用的參數配置進行說明
1、innodb_buffer_pool_size
該參數表示mysql 的Innodb存儲引擎為優化查詢性能而開辟出的一塊記憶體緩沖區

換算成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伺服器的使用率