一、innodb的read-ahead是什么:
所謂的read-ahead就是innodb根據你現在訪問的數據,推測出你接下來可能要訪問的數據,并把它們(可能要訪問的數據)讀入
內存。
?
二、read-ahead是怎么做到的:
1、總的來說read-ahead利用的是程序的局部性原理;在innodb的數據文件中是用頁面來管理的,而每64個頁面組成一個Extend
如果一個Extend的大多數據頁面都被訪問了,那么innodb就認為Extend中的其它頁面被訪問的概率也非常大,于是就可能所
Extend中的其它頁面與一并調入內存了。
2、由于這樣做可以把多次IO請求合并成一次,并且可能把多次IO的隨機讀變成線性讀,這樣就能更高效的利用磁盤的性能。
?
三、read-ahead可能會帶來的問題:
記得之前聽別人說過“飯是個好東西,但是吃多了也容易死人”,read-ahead是個好東西,關鍵在于度,比如說明明只用到
了Extend中的一個頁面,但是把整個Extend的64個頁面調入內存,這樣就會有問題了。
?
四、怎么把握這個度:
1、我們可以設定當一個Extend中的多少個頁面被訪問了的時候就把Extend的其它頁面也調入內存,設定這個閾值的參數就是
innodb_read_ahead_threshold。
2、如果把innodb_read_ahead_threshold設置成58,意思就是說當一個Extend中的58個頁面都被訪問了之后,就把余下的6
個頁面也調入內存。
3、由上面的介紹可知,read-ahead可能帶來性能提升,也可能帶來性能問題;mysql還提供了一個一刀切的辦法,那就是關閉
read-ahead這個功能;可以把innodb_read_ahead_threshold設置成0
?
----
交流學習
?
?
?
?
-----