https://www.linuxidc.com/Linux/2019-04/157969.htm
https://www.cnblogs.com/JiangLe/p/5337383.html
https://www.cnblogs.com/JiangLe/p/5337383.html
Query Cache存儲SELECT語句及其產生的數據結果,特別適用於表數據變化不是很頻繁的場景,例如一些靜態頁面,或者頁面中的某塊不經常發生 變化的信息。如果此表上有任何寫表操作發生,那麼和這個表相關的所有緩存都將失效。
由於Query Cache需要緩存最新數據結果,因此表數據 發生任何變化(INSERT、UPDATE、DELETE或其他有可能產生數據變化的操作),都會導致Query Cache被刷新。對於更新壓力大的數據庫來說,查詢緩存的命中率也會非常低。
但我們可以將參數 query_cache_type 設置成 DEMAND(按需及用)方式,這樣對於默認的SQL語句不使用查詢緩存,而對於確定要使用query cache的SQL語句, 可以用sql_cache的方法指定,例如:
select sql_cache * from table_name;
或 select sql_cache count(*) from table_name;
以下是query_cache_type三個參數的含義:
query_cache_type=0(OFF)關閉
query_cache_type=1(ON)緩存所有結果,除非select語句使用SQL_NO_CACHE禁用查詢緩存
query_cache_type=2(DEMAND),只緩存select語句中通過SQL_CACHE指定需要緩存的查詢
修改爲DEMAND方式:
vi /etc/my.cnf,加入如下行:
query_cache_type =2
保存並重啓MySQL
mysql5.7版本如果直接修改可能會報錯:
mysql>set global query_cache_type=2;
ERROR 1651 (HY000): Query cache is disabled; restart the server with query_cache_type=1 to enable it
-----------------------
MySQL query_cache_type 詳解
MySQL設置查詢緩存的用意:
把查詢到的結果緩存起來,下次再執行相同查詢時就可以直接從結果集中取;這樣就比重新查一遍要快的多。
查詢緩存的最終結果是事與願違:
之所以查詢緩存並沒有能起到提升性能的做用,客觀上有如下兩點原因
1、把SQL語句的hash值作爲鍵,SQL語句的結果集作爲值;這樣就引起了一個問題如 select user from mysql.user 和 SELECT user FROM mysql.user
這兩個將會被當成不同的SQL語句,這個時候就算結果集已經有了,但是一然用不到。
2、當查詢所基於的低層表有改動時與這個表有關的查詢緩存都會作廢、如果對於併發度比較大的系統這個開銷是可觀的;對於作廢結果集這個操作也是要用併發
訪問控制的,就是說也會有鎖。併發大的時候就會有Waiting for query cache lock 產生。
3、至於用不用還是要看業務模型的。
如果何配置查詢緩存:
query_cache_type 這個系統變量控制着查詢緩存工能的開啓的關閉。
query_cache_type=0時表示關閉,1時表示打開,2表示只要select 中明確指定SQL_CACHE才緩存。
這個參數的設置有點奇怪,1、如果事先查詢緩存是關閉的然而用 set @@global.query_cache_type=1; 會報錯
ERROR 1651 (HY000): Query cache is disabled; restart the server with query_cache_type=1 to enable it
2、如果事先是打開着的嘗試去閉關它,那麼這個關閉也是不完全的,這種情況下查詢還是會去嘗試查找緩存。
最好的關閉查詢緩存的辦法就是把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)