2017年3月4日 星期六

innodb setup

※檢查mysqld.log
InnoDB: ERROR: the age of the last checkpoint is .........
innodb_log_file_size 設定越大效率越高,但當資料庫crash時恢復更慢,一般用64M-512M
Innodb_log_buffer_size 經常更新或使用很多blob數據,應調高此值,8M-16M一般應該夠了。

※確認ib_logfile0和ib_logfile1大小(mysql 資料夾下)
[mysqld] 
 innodb_log_file_size=512MB (64MB)
 innodb_log_buffer_size=16MB (4MB)

MySQL innodb檔案成長過大解決辦法
http://mark329329.pixnet.net/blog/post/203721058-mysql-innodb%E6%AA%94%E6%A1%88%E6%88%90%E9%95%B7%E9%81%8E%E5%A4%A7%E8%A7%A3%E6%B1%BA%E8%BE%A6%E6%B3%95

※設定innodb_flush_log_at_trx_commit
[mysqld]
innodb_flush_log_at_trx_commit=0 
  
0:(效率最好,安全性差)日誌緩衝區每秒一次都會將log寫到日誌檔案,並且將硬碟裡的日誌檔案做更新儲存,但是在commit動作下不做任何操作。
1:在每次commit動作時,日誌緩衝區的資料被寫到日誌檔裡,且對日誌檔案更新至硬碟中。(預設值)
2:在每次commit時,日誌緩衝區被寫到日誌檔案,但不對日誌檔案更新至硬碟中

innodb_buffer_pool_size
如果只用Innodb,可以把這個值設為內存的70%-80%。和 key_buffer相同,如果數據量比較小也不怎麼增加,那麼不要把這個值設太高也可以提高內存的使用率。

※ innodb_change_buffering 參數來設定需要進 Cache Buffer 的動作,預設是全部 (all) 變更都會進行 Cache。文件提到有 none, inserts, deletes, changes, purges, all 這些設定,可以依據你的業務需求調整。

※innodb_adaptive_hash_index = ON
MySQL自動替索引建立加速走訪的 Hash 索引,可以提高索引 Insert 與 Search 的速度 (Multiple Concurrent Joins),透過 SHOW ENGINE INNODB STATUS 命令觀察 AHI 的運作狀態,來決定開或關。

※thread_concurrency = 12
網路都建議設為 CPU 核心數的兩倍!? 但其實不要超過核心數比較適合

※innodb_read_ahead_threshold 
透過 SHOW ENGINE INNODB STATUS 可以觀察 Pages 被預載讀取的次數,過高的次數可能會浪費 Disk I/O 而吃掉了性能。可以觀察以下兩的統計值來調整適合的策略:
Innodb_buffer_pool_read_ahead 表示預載進入 Buffer Pool 的 Pages 數量
Innodb_buffer_pool_read_ahead_evicted 表示進到 Buffer Pool 後沒有被使用之後被踢出 Buffer Pool 的 Pages 數

※innodb_io_capacity = 200
InnoDB Master Thread 會將 Buffer Pool 中的資料 (Dirty Pages) 寫回 Disk, innodb_io_capacity 這個參數定義了系統每秒可以處理的 Disk I/O 數量,用意是避免這個機制佔用了太多 Disk I/O 而影響到真正執行 Query 需要的資源。這個算是不容易調整的參數,如果您的 MySQL 伺服器是使用 SSD 那麼建議可以把這個值調高一些,讓 Buffer Pool 背景處理可以更快速。

※innodb_max_dirty_pages_pct (預設 75) 
當 Buffer Pool 中的 Page 有發生變更時,就會變成 Dirty Page,MySQL 會在適當的時機由 Master Thread 將 Dirty Page 刷新到 Disk Page 中,但也不是持續回寫全部的 Dirty Page,我們可以透過調整 innodb_max_dirty_pages_pct來控制 Dirty Pages 存在 Buffer Pool 中的比例,比較明顯的就是關閉 MySQL 時,這些 Buffer Pool 中 Dirty Page 會一次回寫到 Disk

※innodb_spin_wait_delay = 6
Spin 是一種「鎖」運作機制,當其中一個 Thread 取得鎖,其他的 Thread 必須等待 (Sleep) 一段時間,然後看看鎖是否被釋放,這個機制稱為 Spin Lock Polling。這個等待時間就是透過 innodb_spin_wait_delay 進行設定。比較短的 Spin Time 當然可以比較快讓其他 Thread 取得鎖,但是頻率過高會耗費多餘的 CPU 運算