關於MySQL buffer pool的預讀機制

預讀機制mysql

兩種預讀算法ios

  一、線性預讀算法

  二、隨機預讀sql

對預讀的監控數據庫

1、預讀機制  dom

  InnoDB在I/O的優化上有個比較重要的特性爲預讀,預讀請求是一個i/o請求,它會異步地在緩衝池中預先回遷多個頁面,預計很快就會須要這些頁面,這些請求在一個範圍內引入全部頁面。InnoDB以64個page爲一個extent,那麼InnoDB的預讀是以page爲單位仍是以extent?異步

 

  數據庫請求數據的時候,會將讀請求交給文件系統,放入請求隊列中;相關進程從請求隊列中將讀請求取出,根據需求到相關數據區(內存、磁盤)讀取數據;取出的數據,放入響應隊列中,最後數據庫就會從響應隊列中將數據取走,完成一次數據讀操做過程。性能

  接着進程繼續處理請求隊列,(若是數據庫是全表掃描的話,數據讀請求將會佔滿請求隊列),判斷後面幾個數據讀請求的數據是否相鄰,再根據自身系統IO帶寬處理量,進行預讀,進行讀請求的合併處理,一次性讀取多塊數據放入響應隊列中,再被數據庫取走。(如此,一次物理讀操做,實現多頁數據讀取,rrqm>0(# iostat -x),假設是4個讀請求合併,則rrqm參數顯示的就是4)優化

 

2、兩種預讀算法ui

  InnoDB使用兩種預讀算法來提升I/O性能:線性預讀(linear read-ahead)和隨機預讀(randomread-ahead)

  爲了區分這兩種預讀的方式,咱們能夠把線性預讀放到以extent爲單位,而隨機預讀放到以extent中的page爲單位。線性預讀着眼於將下一個extent提早讀取到buffer pool中,而隨機預讀着眼於將當前extent中的剩餘的page提早讀取到buffer pool中。

一、線性預讀(linear read-ahead)

  線性預讀方式有一個很重要的變量控制是否將下一個extent預讀到buffer pool中,經過使用配置參數innodb_read_ahead_threshold,控制觸發innodb執行預讀操做的時間。

  若是一個extent中的被順序讀取的page超過或者等於該參數變量時,Innodb將會異步的將下一個extent讀取到buffer pool中,innodb_read_ahead_threshold能夠設置爲0-64的任何值(由於一個extent中也就只有64頁),默認值爲56,值越高,訪問模式檢查越嚴格。

mysql> show variables like 'innodb_read_ahead_threshold';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| innodb_read_ahead_threshold | 56    |
+-----------------------------+-------+

  例如,若是將值設置爲48,則InnoDB只有在順序訪問當前extent中的48個pages時才觸發線性預讀請求,將下一個extent讀到內存中。若是值爲8,InnoDB觸發異步預讀,即便程序段中只有8頁被順序訪問。

  能夠在MySQL配置文件中設置此參數的值,或者使用SET GLOBAL須要該SUPER權限的命令動態更改該參數。

  在沒有該變量以前,當訪問到extent的最後一個page的時候,innodb會決定是否將下一個extent放入到buffer pool中。

二、隨機預讀(randomread-ahead)

  隨機預讀方式則是表示當同一個extent中的一些page在buffer pool中發現時,Innodb會將該extent中的剩餘page一併讀到buffer pool中。

mysql> show variables like 'innodb_random_read_ahead';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_random_read_ahead | OFF   |
+--------------------------+-------+

  因爲隨機預讀方式給innodb code帶來了一些沒必要要的複雜性,同時在性能也存在不穩定性,在5.5中已經將這種預讀方式廢棄,默認是OFF。若要啓用此功能,即將配置變量設置innodb_random_read_ahead爲ON。

 

3、監控Innodb的預讀

一、能夠經過show engine innodb status\G顯示統計信息

mysql> show engine innodb status\G
----------------------
BUFFER POOL AND MEMORY
----------------------
……
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
……

  一、Pages read ahead:表示每秒讀入的pages;

  二、evicted without access:表示每秒讀出的pages;

  三、通常隨機預讀都是關閉的,也就是0。

二、經過兩個狀態值,評估預讀算法的有效性

mysql> show global status like '%read_ahead%';
+---------------------------------------+-------+
| Variable_name                         | Value |
+---------------------------------------+-------+
| Innodb_buffer_pool_read_ahead_rnd     | 0     |
| Innodb_buffer_pool_read_ahead         | 2303  |
| Innodb_buffer_pool_read_ahead_evicted | 0     |
+---------------------------------------+-------+
3 rows in set (0.01 sec)

  一、Innodb_buffer_pool_read_ahead:經過預讀(後臺線程)讀入innodb buffer pool中數據頁數

  二、Innodb_buffer_pool_read_ahead_evicted:經過預讀來的數據頁沒有被查詢訪問就被清理的pages,無效預讀頁數

相關文章
相關標籤/搜索