前言
最近在研究mysql時,發現查詢緩存和緩衝池是兩個比較容易混淆的點,在這裏簡單提一下二者的聯繫與區別。
正文
查詢緩存
首先看下mysql的結構圖,如下所示:
可以看到,查詢緩存作用於第二層,即核心服務層。
其主要作用是保存查詢返回的完整結果。當查詢命中該緩存, MySQL會立刻返回結果。跳過了 解析,優化和執行階段,加快查詢速度。
判斷緩存命中的方法很簡單:緩存存放在一個引用表中,通過一個哈希值引用。
查詢緩存系統會跟蹤查迫中涉及的每個表,如果這些表發生變化,那麼和這個表相關的的存數據都將失效。
注意:在 mysql8 後已經沒有查詢緩存這個功能了,因爲這個緩存非常容易被清空掉,命中率比較低。
相關命令
query_cache_type
是否打開查詢緩存。可以設置成0FN或 DEMAND。 DEMAND表示只有在查詢語句中明確寫明SQL_ CACHE的語句才放入查詢緩存。這個變量可以是會話級別的也可以是全局級別的。
query_cache_size
查詢緩存使用的總內存空間,單位是字節。這個值必須是1024的整數倍,否則 MySQL實際分配的數據會和你指定的略有不同。
緩衝池
再來看看緩衝池,首先看下“Innodb的緩存和日誌”架構圖。
從架構圖中可以看出,緩衝池是在存儲引擎層面提到的。
緩衝池簡單來說就是一塊內存區域,通過內存的速度來彌補磁盤速度較慢對數據庫性能的影響。在數據庫當中讀取頁的操作,首先將從磁盤讀到的頁存放在緩存池中,下一次再讀相同的頁時,首先判斷該頁是不是在緩衝池中。若在,直接讀取。否則,讀取磁盤上的頁。
那麼,如果sql語句修改了緩存池的頁的數據,數據是怎麼同步到磁盤保存的?
對於數據庫中頁的修改操作,則首先修改緩存池中的頁,然後再以一定的頻率刷新到磁盤上。注意:緩衝池刷新回磁盤並不是每次頁發生更新時觸發,而是通過一種稱爲Checkpoint的機制刷新回磁盤。這樣,是爲了進一步提高數據庫整體性能。
二者區別
注意:以下的默認大小的環境均爲:(MariaDB 10.4.11)。
緩衝區:
-
innodb大小:(innodb_buffer_pool_size)默認爲256MB,比查詢緩存大,在《高性能mysql》中,作者建議"如果在一個獨立使用的mysql服務器上,其爲服務器內存的75%-80%",不過具體的大小配置還是需要與實際業務結合。
-
myisam大小:(key_buffer_size)默認爲132MB
- Myisam引擎有Key Cache:專門緩存索引,淘汰算法LRU
Innodb引擎有buffer pool:緩存數據和索引,淘汰算法LRU
- Myisam引擎有Key Cache:專門緩存索引,淘汰算法LRU
-
作用於存儲引擎層
-
緩存數據的頁
查詢緩存:
- 大小(query_cache_size),默認爲64MB
- 作用於服務器層
- 緩存查詢對應的結果
總結
以上是我近期學習後的一些小總結,不足之處還望指出。
最後提一點個人學習的tips:在學習新框架,新技術時,不妨先嚐試研究下其結構圖、架構圖,對該技術在宏觀上有了一定的瞭解和認識後,再逐步深入研究,可能會有意想不到的效果喔。