天天看點

mysql參數優化(解決大并發,高IO)

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,記錄連續讀的時候産生的預讀次數;