innodb_buffer_pool_size 參數用來設置 Innodb 最主要的 Buffer(Innodb_Buffer_Pool)的大小,也 就是緩存用戶表及索引數據的最主要緩存空間,對 Innodb 整體性能影響也最大
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,記錄連續讀的時候產生的預讀次數;