首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 查詢緩存命令行啟用與驗證實戰教程

     編輯:MySQL 資料庫相關知識

查詢緩存工作原理

  • Key:SQL 文本逐字節 Hash(區分大小寫、空格、字符集)
  • Value:完整結果集
  • 失效:表任意 DML/DDL 觸發相關緩存全部失效
  • 適用場景:讀多寫少、結果集小、重複查詢高(配置表、字典、報表)

動態啟用步驟(無需重啟)

-- 1. 分配緩存內存(單位:字節)
SET GLOBAL query_cache_size = 102760448;  -- ~98 MB
SET GLOBAL query_cache_limit = 2097152;   -- 2 MB/查詢

-- 2. 啟用按需模式
SET GLOBAL query_cache_type = 2;  -- DEMAND

-- 3. 當前會話啟用緩存
SET SESSION query_cache_type = ON;

注意:GLOBAL 變量僅對**新連接**生效,當前會話需設 SESSION。

驗證緩存生效

mysql> USE test;
mysql> SELECT COUNT(*) FROM animals;  -- 首次查詢
+----------+
| count(*) |
+----------+
| 6        |
+----------+

mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits   | 0     |
+---------------+-------+

mysql> SELECT COUNT(*) FROM animals;  -- 完全相同 SQL
+----------+
| count(*) |
+----------+
| 6        |
+----------+

mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits   | 1     |  -- 命中 +1
+---------------+-------+

寫操作導致緩存失效演示

mysql> INSERT INTO animals SELECT 9, 'testsds';
Query OK, 1 row affected

mysql> SELECT COUNT(*) FROM animals;  -- 數據已變,緩存失效
+----------+
| count(*) |
+----------+
| 7        |
+----------+

mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits   | 1     |  -- 仍為 1,未命中

mysql> SELECT COUNT(*) FROM animals;  -- 新結果入緩存
mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits   | 2     |  -- 再次命中
+---------------+-------+

持久化配置

[mysqld]
query_cache_type = 2
query_cache_size = 268435456   # 256 MB
query_cache_limit = 1048576    # 1 MB
query_cache_min_res_unit = 2048 # 2 KB 減少碎片

修改後 systemctl restart mysqld 生效。

核心狀態變量解讀

變量含義異常判斷
Qcache_free_blocks空閒內存塊數過大 → 碎片,執行 FLUSH QUERY CACHE
Qcache_free_memory剩餘內存過小 → 擴大 query_cache_size
Qcache_hits命中次數持續增長為正常
Qcache_inserts寫入次數-
Qcache_lowmem_prunes內存不足淘汰次數持續增長 → 內存不足或碎片嚴重
Qcache_not_cached未緩存查詢數含非 SELECT、NOW() 等不可緩存函數
Qcache_queries_in_cache當前緩存查詢數-
Qcache_total_blocks總塊數-

維護命令

  • FLUSH QUERY CACHE:整理碎片,**不清除數據**
  • RESET QUERY CACHE:**清空所有緩存**
  • FLUSH TABLES:同步效果等同 RESET

版本遷移提醒

  • MySQL 5.7.20:標記棄用
  • MySQL 8.0:**完全移除**
  • 替代方案:應用層 Redis、InnoDB Buffer Pool 預熱、物化視圖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved