mysql 緩存是如何使用內存的

首先提一下查詢緩存

       在解析一個查詢語句前,如果查詢緩存是打開的,而且查詢語句是命中查詢緩存中的數據。在檢查一次用戶權限後直接返回緩存中的結果。這種情況下,查詢不會被解析,也不會生成執行計劃,更不會執行。

開啓緩存也會帶來開銷,主要表現在以下幾個方面:

  1. 任何的查詢語句在開始之前都必須經過檢查,即使這條SQL語句永遠不會命中緩存

  2. 如果查詢結果可以被緩存,那麼執行完成後,會將結果存入緩存,也會帶來額外的系統消耗

有的情況查詢緩存不會被緩存,即使你使用 SQL_CACHE也不能緩存

主要爲以下幾種:

  • 引用了用戶自定義函數
  • 引用了用戶自定義變量
  • 以用了存續過程
  • 查詢中包含一些實時的系統函數,比如now
  • 引用了臨時表

雖然上面說到緩存會帶來一些開銷,但是緩存對mysql還是很重要,帶來的好處比壞處多。

那麼mysql緩存是如何使用內存的?
       查詢緩存的內存池被分爲大小可變的塊,每一個快都知道自己的大小,指向前一個和後一個邏輯塊和物理塊 的指針,服務器啓動時初始化查詢緩存使用的物理內存,內存池開始會設置一個塊,它的大小爲被配置爲緩存的大小減去自身需要的40KB大小。在每次緩存查詢結果時,會爲查詢結果分配一個緩存塊,但是服務器無法估計需要緩存的結果的大小,至少會大於等於query_cache_min_res_unit,,服務器在分配時,不會再緩存中一次生成最終結果然後緩存發送到客戶端,而是產生一條緩存一條,這樣緩存就能保證空間不會在分配時浪費或者不足。分配內存塊的速度較慢,因爲服務器需要檢查可用內存列表並且找打大小合適的快,因此服務器會盡量減少分配次數,當需要緩存結果時,他會構建一個大小至少爲最小值的塊,並且把結果放在塊中,如果塊已經滿了,但是數據沒有完整保存,那麼就會產生一個新塊並且保存數據,在數據存完後,如果數據塊還有空隙,服務器就會剪輯數據塊,並且把空間併入剩餘的空間中,在其中可能產生碎片。通過緊縮,可以講碎片空間併入有效的數據空間中。

對於事物引擎,比如innodb,事物會影響緩存,因爲髒數據也會讓其他引用了這塊數據的緩存失效。直到該事物提交或回滾之後,這塊數據纔會被緩存。
query_cache_min_res_unit:the minimum size (in bytes) for blocks allocated by the query cache. The default value is 4096 (4KB)

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