面試寶典系列-MySQL緩存詳解

在mysql中,Query Cache默認是打開的,能夠提升查詢效率。mysql

但這不表明開啓Query Cache就對mysql的性能有所提升。由於若是有大量的修改時,因爲修改形成cache失效,會給服務器形成更大的開銷。算法

控制緩存的配置是:query_cache_type,0:關閉,1:開啓,2:只有select 中明確指定SQL_CACHE才緩存。sql

須要注意的是Query cache對sql的大小寫敏感,由於Query Cache在內存中是以Hash結構來進行映射的,而Hash算法的基礎是sql語句的字符,因此任何sql語句的改變會從新cache。緩存

緩存的生成:

  • query cache內容是select的結果集
  • prepared statement永遠不會緩存,即便參數徹底一致
  • where條件中包含了某些函數永遠不會緩存,如current_date, now等
  • 太大的結果集(> query_cache_limit)不會被cache

 緩存的更新和失效:

  • 在Mysql中,能夠設置Query Cache所使用的總內存(query_cache_size),MySQL會把默承認以進行緩存的SQL語句的結果集進行緩存,一旦內存塞滿後,就會剔除老的Query Cache對象。
  • 表數據進行任何一行的修改,基於該表相關的cache當即所有失效。爲何不作智能些?由於分析cache內容太複雜,影響性能。

緩存的使用場景:

  • 當有大量的查詢和大量的修改時,cache機制可能會形成性能降低。由於每次修改會致使系統去作cache失效操做,形成不小的開銷。
  • 系統cache的訪問由一個單一的全局鎖來控制,這時候大量的查詢將被阻塞,直至鎖釋放。

指定使用緩存和不使用緩存:

-- 指定不使用緩存
select SQL_NO_CACHE count() from t_user where tell = "153*******";

-- 指定使用緩存
select SQL_CACHE count() from t_user where tell = "153*******";

監控緩存:

使用命令:show status like ‘qcache%’;服務器

Qcache_free_blocks:緩存中相鄰內存塊的個數。數目大說明可能有碎片。FLUSH QUERY CACHE會對緩存中的碎片進行整理,從而獲得一個空閒塊。函數

Qcache_free_memory:緩存中的空閒內存。性能

Qcache_hits:每次查詢在緩存中命中時就增大spa

Qcache_inserts:每次插入一個查詢時就增大。命中次數除以插入次數就是不中比率。code

Qcache_lowmem_prunes:緩存出現內存不足而且必需要進行清理以便爲更多查詢提供空間的次數。這個數字最好長時間來看;若是這個 數字在不斷增加,就表示可能碎片很是嚴重,或者內存不多。(上面的 free_blocks和free_memory能夠告訴您屬於哪一種狀況)對象

Qcache_not_cached:不適合進行緩存的查詢的數量,一般是因爲這些查詢不是 SELECT 語句或者用了now()之類的函數。

Qcache_queries_in_cache:當前緩存的查詢(和響應)的數量。

Qcache_total_blocks:緩存中塊的數量。

相關文章
相關標籤/搜索