mysql> SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data'; 1.可是當innodb作crash recovery的時候,大的pool buffer會讓recovery奇慢無比。 一種折衷的解決方法就是:啓動的時候用小的pool buffer,恢復完成之後改用大的pool bufer。設置的過大,會致使system的swap空間被佔用,致使操做系統變慢,從而減低sql查詢的效率。
2.做用:這個參數主要做用是緩存innodb表的索引,數據,插入數據時的緩衝。
3.方法一:mysql
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_buffer_pool_pages_data | 1388 |
+-------------------------------+-------+
1 row in set (0.00 sec)sql
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total';
+--------------------------------+--------+
| Variable_name | Value |
+--------------------------------+--------+
| Innodb_buffer_pool_pages_total | 131071 |
+--------------------------------+--------+
1 row in set (0.00 sec)數據庫
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_page_size';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| Innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)緩存
'Innodb_buffer_pool_pages_data' X 100 / 'Innodb_buffer_pool_pages_total'網絡
當結果 > 95% 則增長 innodb_buffer_pool_size, 建議使用 ram total 75%
當結果 < 95% 則減小 innodb_buffer_pool_size,
建議 'Innodb_buffer_pool_pages_data' X 'Innodb_page_size' X 1.05 / (1024*1024*1024)性能
4.方法二:測試
Innodb 存儲引擎的緩存機制和 MyISAM 的最大區別就在於 Innodb 不只僅緩存索引,同時還會緩存實 際的數據。因此,徹底相同的數據庫,使用 Innodb 存儲引擎可使用更多的內存來緩存數據庫相關的信 息,固然前提是要有足夠的物理內存。這對於在如今這個內存價格不斷下降的時代,無疑是個很吸引人 的特性。優化
innodb_buffer_pool_size 參數用來設置 Innodb 最主要的 Buffer(Innodb_Buffer_Pool)的大小,也 就是緩存用戶表及索引數據的最主要緩存空間,對 Innodb 總體性能影響也最大。不管是 MySQL 官方手冊 仍是網絡上不少人所分享的 Innodb 優化建議,都簡單的建議將 Innodb 的 Buffer Pool 設置爲整個系統 物理內存的 50% ~ 80% 之間。如此輕率的給出此類建議,我我的以爲實在是有些不妥。spa
不論是多麼簡單的參數,均可能與實際運行場景有很大的關係。徹底相同的設置,不一樣的場景下的 表現可能相差很大。就從 Innodb 的 Buffer Pool 到底該設置多大這個問題來看,咱們首先須要肯定的是 這臺主機是否是就只提供 MySQL 服務?MySQL 須要提供的的最大鏈接數是多少?MySQL 中是否還有 MyISAM 等其餘存儲引擎提供服務?若是有,其餘存儲引擎所須要使用的 Cache 須要多大?操作系統
假設是一臺單獨給 MySQL 使用的主機,物理內存總大小爲 8G,MySQL 最大鏈接數爲 500,同時還使用 了 MyISAM 存儲引擎,這時候咱們的總體內存該如何分配呢?
內存分配爲以下幾大部分:
a) 系統使用,假設預留 800M;
b) 線程獨享,約 2GB = 500 * (1MB + 1MB + 1MB + 512KB + 512KB),組成大概以下:sort_buffer_size:1MB join_buffer_size:1MB read_buffer_size:1MB read_rnd_buffer_size:512KB thread_statck:512KB
c) MyISAM Key Cache,假設大概爲 1.5GB;
d) Innodb Buffer Pool 最大可用量:8GB - 800MB - 2GB - 1.5GB = 3.7GB;
假設這個時候咱們還按照 50%~80%的建議來設置,最小也是 4GB,而經過上面的估算,最大可用值 在 3.7GB 左右,那麼極可能在系統負載很高當線程獨享內存差很少出現極限狀況的時候,系統極可能就 會出現內存不足的問題了。並且上面還僅僅只是列出了一些使用內存較大的地方,若是進一步細化,很 可能可用內存會更少。上面只是一個簡單的示例分析,實際狀況並不必定是這樣的,這裏只是但願你們瞭解,在設置一些 參數的時候,千萬不要想固然,必定要詳細的分析可能出現的狀況,而後再經過不斷測試調整來達到自 己所處環境的最優配置。就我我的而言,正式環境上線之初,我通常都會採起相對保守的參數配置策 略。上線以後,再根據實際狀況和收集到的各類性能數據進行鍼對性的調整。
當系統上線以後,咱們能夠經過 Innodb 存儲引擎提供給咱們的關於 Buffer Pool 的實時狀態信息做 出進一步分析,來肯定系統中 Innodb 的 Buffer Pool 使用狀況是否正常高效:
sky@localhost : example 08:47:54> show status like 'Innodb_buffer_pool_%';
+-----------------------------------+-------+
| Variable_name | Value |
+-----------------------------------+-------+
| Innodb_buffer_pool_pages_data | 70 |
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_pages_flushed | 0 |
| Innodb_buffer_pool_pages_free | 1978 |
| Innodb_buffer_pool_pages_latched | 0 |
| Innodb_buffer_pool_pages_misc | 0 |
| Innodb_buffer_pool_pages_total | 2048 |
| Innodb_buffer_pool_read_ahead_rnd | 1 |
| Innodb_buffer_pool_read_ahead_seq | 0 |
| Innodb_buffer_pool_read_requests | 329 |
| Innodb_buffer_pool_reads | 19 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 0 |
+-----------------------------------+-------+
從上面的值咱們能夠看出總共 2048 pages,還有 1978 是 Free 狀態的僅僅只有 70 個 page 有數據, read 請求 329 次,其中有 19 次所請求的數據在 buffer pool 中沒有,也就是說有 19 次是經過讀取物理 磁盤來讀取數據的,因此很容易也就得出了 Innodb Buffer Pool 的 Read 命中率大概在爲:(329 - 19)/ 329 * 100% = 94.22%。
固然,經過上面的數據,咱們還能夠分析出 write 命中率,能夠獲得發生了多少次 read_ahead_rnd,多少次 read_ahead_seq,發生過多少次 latch,多少次由於 Buffer 空間大小不足而產 生 wait_free 等等。
單從這裏的數據來看,咱們設置的 Buffer Pool 過大,僅僅使用 70 / 2048 * 100% = 3.4%。
在 Innodb Buffer Pool 中,還有一個很是重要的概念,叫作「預讀」。通常來講,預讀概念主要是 在一些高端存儲上面纔會有,簡單來講就是經過分析數據請求的特色來自動判斷出客戶在請求當前數據 塊以後可能會繼續請求的數據快。經過該自動判斷以後,存儲引擎可能就會一次將當前請求的數據庫和 後面可能請求的下一個(或者幾個)數據庫一次所有讀出,以指望經過這種方式減小磁盤 IO 次數提升 IO 性能。在上面列出的狀態參數中就有兩個專門針對預讀:
Innodb_buffer_pool_read_ahead_rnd,記錄進行隨機讀的時候產生的預讀次數; Innodb_buffer_pool_read_ahead_seq,記錄連續讀的時候產生的預讀次數;