先說明2點
開啟緩衝也會帶來開銷,主要表現在一下方面
讀取在查詢開始之前必須要檢查緩衝
如果查詢是緩衝的,但是不在結果集中,那麼產生結果後儲存資料會帶來一定的開銷
向緩衝寫如資料也會帶來開銷
有的情況查詢快取不會被緩衝,即使你使用 SQL_CACHE也不能緩衝
主要一下幾個
引用了使用者自訂函數
引用了使用者自訂變數
以用了存續過程
查詢中包含一些即時的系統函數,比如now
引用了暫存資料表
雖然上面說到緩衝會帶來一些開銷
但是緩衝對mysql 還是很重要
帶來的好處比壞處多
下面講一下mysql緩衝如何使用記憶體
查詢快取的記憶體池被分為大小可變的塊,每一個快都知道自己的大小,指向前一個和後一個邏輯塊和物理塊 的指標,伺服器啟動時初始化查詢快取使用的實體記憶體,記憶體池開始咋hi要一個快,她的大小為被配置為緩衝的大小減去自身需要的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)