MySQL設置查詢緩存的用意:mysql
把查詢到的結果緩存起來,下次再執行相同查詢時就能夠直接從結果集中取;這樣就比從新查一遍要快的多。sql
查詢緩存的最終結果是事與願違:緩存
之因此查詢緩存並無能起到提高性能的作用,客觀上有以下兩點緣由併發
一、把SQL語句的hash值做爲鍵,SQL語句的結果集做爲值;這樣就引發了一個問題如 select user from mysql.user 和 SELECT user FROM mysql.user 性能
這兩個將會被當成不一樣的SQL語句,這個時候就算結果集已經有了,可是一然用不到。rest
二、當查詢所基於的低層表有改動時與這個表有關的查詢緩存都會做廢、若是對於併發度比較大的系統這個開銷是可觀的;對於做廢結果集這個操做也是要用併發server
訪問控制的,就是說也會有鎖。併發大的時候就會有Waiting for query cache lock 產生。內存
三、至於用不用仍是要看業務模型的。hash
若是何配置查詢緩存:it
query_cache_type 這個系統變量控制着查詢緩存工能的開啓的關閉。
query_cache_type=0時表示關閉,1時表示打開,2表示只要select 中明確指定SQL_CACHE才緩存。
這個參數的設置有點奇怪,一、若是事先查詢緩存是關閉的然而用 set @@global.query_cache_type=1; 會報錯
ERROR 1651 (HY000): Query cache is disabled; restart the server with query_cache_type=1 to enable it
二、若是事先是打開着的嘗試去閉關它,那麼這個關閉也是不徹底的,這種狀況下查詢仍是會去嘗試查找緩存。
最好的關閉查詢緩存的辦法就是把my.cnf 中的query_cache_type=0而後再重啓mysql。
查詢緩存相關的系統變量:
have_query_cache 表示這個mysql版本是否支持查詢緩存。
query_cache_limit 表示單個結果集所被容許緩存的最大值。
query_cache_min_res_unit 每一個被緩存的結果集要佔用的最小內存。
query_cache_size 用於查詢緩存的內存大小。
如何監控查詢緩存的命中率:
Qcache_free_memory 查詢緩存目前剩餘空間大小。
Qcache_hits 查詢緩存的命中次數。
Qcache_inserts 查詢緩存插入的次數。
也就是說緩存的命中率爲 Qcache_hits/(Qcache_hits+Qcache_inserts)