官方文檔定義:SQL_NO_CACHE means that the query result is not cached. It does not mean that the cache is not used to answer the query.
翻譯: 該查詢**結果不寫入** Query Cache,**但不代表本次查詢不讀取 Cache**。
若要強制不讀取 Cache,需:RESET QUERY CACHE 或修改表結構導致 Cache 失效。
| 參數 | 含義 | 建議值 |
|---|---|---|
| have_query_cache | 是否支援 Query Cache | YES(5.7 預設開啟,8.0 已移除) |
| query_cache_size | 快取總記憶體大小,0 為停用 | 0(高併發寫入場景建議關閉) |
| query_cache_type | 快取模式:0=OFF, 1=ON, 2=DEMAND | 0 或 2 |
| query_cache_limit | 單次查詢結果最大可快取大小 | 1M(預設) |
| query_cache_min_res_unit | 快取分配最小記憶體塊 | 4K(預設),大結果集可調大減少碎片 |
SHOW STATUS LIKE 'Qcache%';
| 指標 | 含義 | 異常判斷 |
|---|---|---|
| Qcache_hits | 命中次數 | 低命中率 → 關閉或調整 |
| Qcache_inserts | 寫入快取次數 | 過高 → 寫入開銷大 |
| Qcache_lowmem_prunes | 因記憶體不足被清除次數 | 持續增長 → 擴大 query_cache_size |
| Qcache_free_blocks | 空閒記憶體塊數 | 過多 → 碎片嚴重,執行 FLUSH QUERY CACHE |
| Qcache_not_cached | 未快取查詢數 | 含 SQL_NO_CACHE、大結果集等 |
-- 整理碎片(不清除內容) FLUSH QUERY CACHE; -- 完全清除 RESET QUERY CACHE;
query_cache_min_res_unit 調優公式:
query_cache_min_res_unit = (query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache
INDEX idx_store_film (store_id, film_id) SELECT store_id, film_id FROM inventory; -- Using index
-- 原始:LIMIT 10000, 10 掃描 10010 行 SELECT id, title, content FROM article ORDER BY created DESC LIMIT 10000, 10; -- 優化:子查詢只取 ID(覆蓋索引),再 JOIN 回表 SELECT a.id, a.title, a.content FROM article a INNER JOIN ( SELECT id FROM article ORDER BY created DESC LIMIT 10000, 10 ) p USING (id);
建立索引 (created, id)(InnoDB 輔助索引含主鍵),子查詢走覆蓋索引,極速定位 ID。