MySQL查詢緩存

MySQL查詢緩存mysql

用於保存MySQL查詢語句返回的完整結果,被命中時,MySQL會當即返回結果,省去解析、優化和執行等階段。sql

如何檢查緩存?緩存

MySQL保存結果於緩存中:服務器

把SELECT語句自己作hash計算,計算結果爲key,查詢結果做爲value。函數

不會被緩存的數據:性能

查詢語句中有一些不肯定數據時,不會緩存,例如NOW(),CURRENT_TIME(),通常來講,若是查詢中包含自定義函數、存儲函數、用戶變量、臨時表、mysql庫中系統表、或者任何包含權限的表,通常都不會被緩存。優化

緩存會帶來額外開銷:spa

一、每一個查詢都得先檢查是否命中;對象

二、檢查結果要先緩存;內存

與緩存相關的變量:

查看緩存變量SHOW GLOBAL VARIABLES LIKE 'query_cache%';

query_cache_limit:單個緩存對象的最大值,超出的不緩存,手動使用SQL_NO_CACHE能夠人爲避免嘗試緩存返回結果超出此參數限定值的語句。

query_cache_min_res_unit:存儲緩存的最小內存塊;計算方法:(query_cache_size-Qcache_free_memory)/Qcache_queries_in_cache

query_cache_size:總空間,單位爲字節,大小必須是1024倍數。MySQL啓動時,會一次分配並當即初始化這裏指定大小的內存空間,這意味着,若是修改此大小,會清空緩存,並從新初始化;

query_cache_type:查詢緩存類型;是否開啓緩存功能,開啓方式有三種{ON|OFF|DEMAND};

DEMAND:意味着SELECT語句明確使用SQL_CACHE選項是纔會緩存;query_cache_wlock_invalidate:若是某個數據表被其餘用戶鏈接鎖住了,是否仍然從緩存中返回結果,OFF表示返回。

如何判斷命中率:

SHOW GLOBAL STATUS LIKE 'Qcache%';

Qcache_free_blocks:空閒塊數

Qcache_free_memory:空閒空間

Qcache_hits:命中次數

Qcache_inserts:向緩存空間中寫入緩存的次數

Qcache_lowmem_prunes:由於內存小,騰出內存的次數

Qcache_not_cached:沒被緩存的個數

Qcache_queries_in_cache:在緩存中緩存的插入的查詢的個數

Qcache_total_blocks:總塊數

碎片整理:FLUSH QUERY_CACHE

清除緩存:RESET QUERY_CACHE

計算命中率:

SHOW GLOBAL STATUS WHERE Variable_name='Qcache_hits' OR Variable_name='Com_select';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| Com_select    | 10     |

| Qcache_hits   | 0      |

+---------------+-------+

Qcache_hits/( Com_select+ Qcache_hits)

還須要參考命中和寫入的比率,即Qcache_hits/ Qcache_inserts的值,此值若是能大於3:1,則代表緩存也是有效的,能達到10:1,爲比較理想的狀況。若是命中率很低,比值也徘徊在1:1,那說明緩存沒什麼卵用,仍是關了吧。

緩存優化思路:

使用緩存時如何可以讓緩存命中,提升緩存的有效性:

一、批量寫入而非屢次單個寫入,這樣便可僅一次的影響緩存

二、過大的緩存空間,可能會使大量的緩存失效時致使形成服務器假死,因此緩存空間不宜過大

三、必要時,使用SQL_NO_CACHE手動控制緩存

四、對寫密集型的應用場景來講,禁用緩存反而能提升性能

相關文章
相關標籤/搜索