MySQL查詢緩存與緩衝區的區別

前言

最近在研究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
  • 作用於存儲引擎層

  • 緩存數據的頁

查詢緩存:

  • 大小(query_cache_size),默認爲64MB
  • 作用於服務器層
  • 緩存查詢對應的結果

總結

以上是我近期學習後的一些小總結,不足之處還望指出。

最後提一點個人學習的tips:在學習新框架,新技術時,不妨先嚐試研究下其結構圖、架構圖,對該技術在宏觀上有了一定的瞭解和認識後,再逐步深入研究,可能會有意想不到的效果喔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章