(014)mysql 技巧 * 判斷查詢緩存是否命中

原理

MySQL 服務收到到查詢請求時,會先在內存中找是否有完全一致的查詢語句數據,有直接返回,無才經過一系列步驟查詢數據,注意是語句完全一致才能被查詢緩存命中。

如下:

  1. SELECT * FROM tbl
  2. SELECT * from tbl

這兩條語句因 FROM 和 from 不同而被視爲不同的查詢。

開啓

# 查詢查詢緩存的信息
SHOW VARIABLES LIKE 'have_query_cache';  
# have_query_cache  是否支持查詢緩存,MySQL8之後不支持查詢緩存了
SHOW VARIABLES LIKE 'query_cache_type'; 
query_cache_type	是否已開啓查詢緩存,MySQL5.6之後默認關閉
# (可見MySQL似乎不太建議我們使用查詢緩存,關於查詢緩存的優劣見仁見智)
# 打開 >>> vi /etc/my.cnf
# 在[mysqld]下添加:
query_cache_size = 20M
query_cache_type = ON
# 重啓 mysqld

測試

SELECT * FROM users WHERE id = 1;

第一次執行:

可見 Qcache_hits(緩存命中數): 0,Qcache_inserts(插入緩存數):1,再次執行完全相同的語句:

可見 Qcache_hits(緩存命中數): 1,Qcache_inserts(插入緩存數):0,查詢緩存被命中

擴展:

0. 查詢緩存的總體使用情況

SHOW STATUS LIKE 'qcache%';  

1. 執行不查詢緩存的語句

SELECT SQL_NO_CACHE * FROM users WHERE id = 1;

2. 清除緩存

RESET QUERY CACHE

2. 查詢緩存失效

在表的結構或數據發生改變時,查詢緩存中的數據不再有效。所以查詢緩存適合有大量相同查詢的應用,不適合有大量數據更新的應用。

4. 爲什麼MySQL5.6之後默認關閉查詢緩存,MySQL8之後甚至移除此功能?

MySQL 服務器團隊:緩存建議使用MySQL外部一些數據庫如Redis/Memcache等,效率會更高。

參考:https://mysqlserverteam.com/mysql-8-0-retiring-support-for-the-query-cache/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章