MySQL 查詢緩存
在 SQL 調優的過程中,發現原本很慢的一條 SQL(將近 1 分鍾) 在第二次運行時, 瞬間就完成了(0.04sec)。
這是因為 MySQL 自帶的緩存機制,將查詢結果進行緩存,如果 table 數據未發生變化,再次使用同一條 SQL 進行查詢時,直接從上次的查詢結果緩存中讀取數據,而不是重新分析、執行 SQL。
如果 table 數據發生變化,所有與之相關的緩存都會被釋放刷新,這樣就不會出現數據臟讀問題。
手動選擇是否使用緩存查詢
為了避免緩存,可以在 SQL 查詢語句的字段前增加 SQL_NO_CACHE 關鍵字
如:
select * from t_user; select SQL_NO_CACHE * from t_user;
反之,你也可以使用 SQL_CACHE 關鍵字,強制 MySQL 從緩存中讀取數據
select SQL_CACHE * from t_user;
MySQL 還提供了一種釋放全部緩存的方法:
reset query cache;
查看是否有查詢緩存(注意,只要數據庫擁有查詢緩存功能,這個 VALUE 就是 YES,無論查詢緩存是否啟用, MySQL 默認為啟用狀態):
SHOW VARIABLES LIKE 'have_query_cache';
MySQL 查詢緩存可以通過兩個變量來控制,query_cache_type 和 query_cache_size。
1. query_cache_type
SHOW VARIABLES LIKE 'query_cache_type';
query_cache_type 包含三種狀態:
- 0 or OFF 此時不會從緩存中讀取查詢數據
- 1 or ON 表示除非聲明了 SELECT SQL_NO_CACHE,否則都會從緩存中讀取數據
- 2 or DEMAND 表示所有語句都會從緩存中讀取,相當於所有查詢語句都使用了 SELECT SQL_CACHE
通過如下命令可以設置查詢緩存狀態(需要管理員權限),執行后,需要重啟 MySQL 服務才能生效。
SET GLOBAL query_cache_type = 1;
但是此命令會影響所有的使用此 MySQL 服務的 client。可以通過如下命令,關閉此客戶端的查詢緩存狀態,但是同樣需要重啟 server 后才能生效。
SET SESSION query_cache_type = OFF; SHOW VARIABLES LIKE 'query_cache_type';
2. query_cache_size
SHOW VARIABLES LIKE 'query_cache_size';
query_cache_size 表示緩存大小,默認為 1M。如果設置為 0,則相當於 query_cache_size=OFF。