想像一個典型場景:老闆抱怨新網站回應緩慢,雖然擁有四台最先進的 Web 伺服器,但資料庫伺服器卻不堪負荷。Web 伺服器處理請求的速度太快,大量查詢湧入單一資料庫,導致處理不過來。此時若無法立即採購 Oracle 等昂貴方案,該如何破局?
MySQL 4.0 引入了查詢快取功能,當資料庫重複執行相同查詢且資料集未變更時,可直接返回快取結果集,避免重複掃描資料。這在 Web 伺服器端難以實作快取的情況下尤為實用。
需在設定檔(my.cnf 或 my.ini)中設定兩個關鍵參數:
query_cache_type:0(關閉)、1(開啟)、2(按需)。建議設為 1。query_cache_size:分配給快取的記憶體大小(位元組)。預設為 0(停用),須設定如 20M。設定後可透過 SHOW VARIABLES LIKE '%query_cache%' 確認生效。
使用維基百科資料測試發現:大結果集(超過 1MB)預設不會被快取,受限於 query_cache_limit(預設 1MB)。縮小查詢範圍後,第二次執行同一查詢耗時從 0.38 秒降至 0.11 秒,Qcache_hits 計數增加,驗證快取生效。
查詢必須完全相同(含大小寫、空白)才能命中快取。稍微修改查詢(如關鍵字大小寫)會導致快取未命中,並產生新的快取條目。
重點監控 Qcache_lowmem_prunes:若快速增加且記憶體尚足,可調大 query_cache_size;若長期為 0,可適度縮小快取。此外,Qcache_free_memory 反映剩餘可用空間。
查詢快取是低成本提升 MySQL 讀取效能的利器,尤其適合「讀多寫少」、重複查詢比例高的應用場景。正確設定大小限制、監控淘汰率,能讓資料庫在高併發下依然從容應對。