MYSQL的Query Cache

        MySQL的Query Cache 就是用來緩存和 Query 相關的數據的。緩存客戶端提交給 MySQL 的 SELECT 語句以及該語句的結果集。將 SELECT 語句和語句的結果作了一個 HASH 映射關係而後保存在必定的內存區域中。


主要參數:sql

query_cache_limit:容許 Cache 的單條 Query 結果集的最大容量,默認是1MB,超過此值將不被 Cache
query_cache_min_res_unit:設置Query Cache中每次分配最小內存空間,即每一個Cache佔用的最小空間
query_cache_size:設置Query Cache所使用的最大內存,默認值爲0,大小必須是1024的整數倍,MySQL 會自動調整下降最小量以達到1024的倍數
query_cache_type:控制Query Cache 的開關,能夠設置爲0(OFF),1(ON)和2(DEMAND)三種,意義分別以下:
   0(OFF):關閉 Query Cache 功能,任何狀況下都不會使用 Query Cache
   1(ON):開啓 Query Cache 功能,可是當 SELECT 語句中使用的 SQL_NO_CACHE 提示後,將不使用Query Cache
   2(DEMAND):開啓 Query Cache 功能,可是隻有當 SELECT 語句中使用了 SQL_CACHE 提示後,才使用 Query Cache
query_cache_wlock_invalidate:控制當有寫鎖定發生在表上的時刻是否先失效該表相關的 Query Cache,若是設置爲1(TRUE),則在寫鎖定時將失效該表相關的全部 Query Cache,若是設置爲0(FALSE)則在鎖定時仍然容許讀取該表相關的 Query Cache


經過Global Status 查看Query Cache的狀態:緩存

   Qcache_free_blocks:目前還處於空閒狀態的 Query Cache 中內存 Block 數目
   Qcache_free_memory:目前還處於空閒狀態的 Query Cache 內存總量
   Qcache_hits:Query Cache 命中次數
   Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次數,也就是沒有命中的次數
   Qcache_lowmem_prunes:當 Query Cache 內存容量不夠,須要從中刪除老的 Query Cache 以給新的
                                             Cache 對象使用的次數
   Qcache_not_cached:沒有被 Cache 的 SQL 數,包括沒法被 Cache 的 SQL 以及因爲 query_cache_type
                                       設置的不會被 Cache 的 SQL
   Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 數量
   Qcache_total_blocks:Query Cache 中總的 Block 數量

       根據這幾個狀態能夠計算出 Cache 命中率,計算出 Query Cache 大小設置是否足夠。ide


關於Query Cache的一些說明:
1)以query請求爲對象,不管是否包含多表查詢或子查詢,都只產生一個cache對象。可是存儲方式是HASH結構的映射,因此須要sql語句字符大小寫等同樣,才能在下次查詢時命中。


2)query cache中包含所需結果的結果集,客戶端字符集,數據字符集,客戶端鏈接的default database等性能

3)query cache的查找是在客戶端權限驗證以後,SQL解析以前,減小了語句分析與分析優化,不須要存儲引擎的交互,減小了磁盤I/O與CPU運算。效率很是高。


4)爲了保證 Query Cache 中的內容與是實際數據絕對一致,當表中的數據有任何變化,包括新增,修改,刪除等,都會使全部引用到該表的 SQL 的 Query Cache 失效。 優化


5)當query cache設置爲 1 時,MySQL會對每一個select 語句進行query cache查找,須要消耗資源。對於數據更新頻繁的表,會不斷失效,形成query cache命中低下,影響性能。spa

相關文章
相關標籤/搜索