您好,登錄后才能下訂單哦!
這篇文章主要介紹“MySQL緩存頁滿了怎么解決”,在日常操作中,相信很多人在MySQL緩存頁滿了怎么解決問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL緩存頁滿了怎么解決”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
但是,free鏈表總會有空的時候,也就是說緩存頁都滿了,再沒有空余緩存用來加載磁盤上的數據頁?
這時候我們想,怎么辦?是不是要把一部分緩存頁淘汰掉,也就是清空,然后再加載新的數據頁到緩存頁。
如何淘汰?
MySQL使用了LRU淘汰算法,LRU也就是least recently use,最近最少使用。
策略就是使用的緩存頁就加到LRU鏈表的頭部,只要修改或者查詢過就會移到鏈表頭部,最后淘汰LRU尾部的。
1、MySQL有個預讀機制:當從磁盤中加載一個數據頁的時候,有可能會把相鄰的數據頁也一塊加載到緩存頁。
這會帶來什么問題?
看上圖,比如,空間大小就為4,原本ABC都是經常被訪問的,現在要加入虛線那兩個數據頁,必須要淘汰一個,那肯定就淘汰C,就把常訪問的淘汰了,留下了沒有訪問的相鄰數據頁。
那么在此就有必要了解一下MySQL的預讀機制
①、通過參數innodb_read_ahead_threshold控制,默認是56。這個參數表示如果順序訪問了一個區里的多個數據頁,這里的多個就是56,就會觸發預讀機制,把下一個區中所有的數據頁都加載到緩存頁里。
②、通過參數innodb_random_read_ahead控制,默認是off。這個參數表示如果緩存了一個區的13個連續數據頁,就會觸發預讀機制,把這個區里的頁全都加載到緩存頁里。
2、全表掃描
如果是全表掃描,會把全表都加載到buffer pool中,有可能就把LRU鏈表中經常訪問的都擠到后面去,就有可能被淘汰。
如何優化吶?
既然有經常訪問的數據,又有不常訪問的數據,是不是可以在LRU鏈表中分區啊,對這兩塊數據分別管理。
所有把LRU鏈表分為兩部分,冷熱比例由innodb_old_blocks_pct參數控制,默認是37,也就是說冷數據占比37%。
第一次加載的數據頁,直接放到冷數據區域的頭部。
那什么時候放到熱數據區域那?
通過參數innodb_old_block_time控制,默認1000,毫秒。這個參數表示,必須數據頁加載到緩存頁1000毫秒之后再次訪問才加到熱數據區域。
位于熱數據區域的數據,如果被訪問了,應不應該立即加載熱數據區域的頭部?
無論鏈表方不方便,頻繁的移動肯定是不希望的。MySQL規定,只有在熱數據的后3/4部分的數據被訪問了才會移動到鏈表頭部。
之前的討論都是說緩存滿了才淘汰尾部數據刷入磁盤,實際上并不是非得等滿了。后臺有一個線程,運行一個定時任務,每隔一段時間就刷入磁盤然后清空這幾個緩存頁,并加到free鏈表中。
別忘了,刷入磁盤的不僅僅是冷數據區域,還有flush鏈表,等MySQL不是很忙的時候就會執行,然后從flush鏈表和LRU鏈表中移除。
到此,關于“MySQL緩存頁滿了怎么解決”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。