天天看點

MySql進階三

一、Mysql緩存:

1、緩存包括:

(1)、緩存查詢計劃避免二次詞法文法解析、優化、執行。

(2)、緩存mysql查詢語句傳回的完整結果,被命中時,mysql會了解傳回結果,省去解析、優化和執行等步驟。

2、如何命中緩存?

mysql儲存結果于緩存中:把select語句本身做hash計算,計算的結果作為key,查詢結果作為value

是以在寫sql語句時,大小寫以及順序等要統一,這樣緩存的幾率就大。

3、什麼樣的語句不會被緩存?

查詢語句中有一些不确定資料時,不會緩存:如NOW(),CURRENT_TIME();

一般來說,如果查詢中包含使用者自定義函數、存儲函數、使用者變量、臨時表、

mysql庫中系統表或者權限表,一般都不會被緩存。

4、緩存帶來的額外開銷?

每個查詢都得先檢查是否命中。

查詢結果要先緩存。

5、與緩存相關的變量:

mysql>show global variables like 'query_cache%';

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

| Variable_name           | Value   |

| query_cache_limit        | 1048576 |

| query_cache_min_res_unit   | 4096    |

| query_cache_size         | 16777216 |

| query_cache_type         | ON     |

| query_cache_wlock_invalidate | OFF     |

(1)、query_cache_type:是否開啟緩存功能,

   其值有三種ON|OFF|DEMAND,

   其中DEMAND如果要緩存需要在select語句中需要顯示指明 sql_cache

(2)、query_cache_size:

   緩存總空間,機關位元組,大小必須為1024的整數倍,從上面可以看出預設16M。

   如果變更大小,會清空目前緩存,是以最好開始就設定好。

(3)、query_cache_min_res_unit:存儲緩存的最小記憶體塊。

    (query_cahce_size-Qcache_free_memory)/Qcache_queries_in_cache

   即(緩存總空間-空閑緩存空間)/緩存個數

(4)、query_cache_limit:

   單個緩存對象的最大值,超過則不緩存。從上面可以看出預設1M。

  可以手動使用sql_no_cache人為地避免嘗試緩存傳回查詢結果超出此參數限定值的語句。

(5)、query_cache_wlock_invalidate:

  如果某表被其他使用者連接配接鎖住了,是否仍然從緩存中傳回結果,OFF為傳回,建議使用OFF傳回。

6、如果判斷緩存命中率:

(1)、mysql>show global status like 'Qcache%';

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

| Variable_name           | Value    |

| Qcache_free_blocks      | 1        |

| Qcache_free_memory      | 16757128 |

| Qcache_hits             | 3        |

| Qcache_inserts          | 2        |

| Qcache_lowmem_prunes    | 0        |

| Qcache_not_cached       | 29       |

| Qcache_queries_in_cache | 2        |

| Qcache_total_blocks     | 6        |

Qcache_hits :命中緩存的次數。

Qcache_inserts:寫入緩存的次數。

Qcache_free_memory:空閑緩存空間。

Qcache_total_blocks:已申請的塊數。

Qcache_free_blocks:空閑塊數。

Qcache_queries_in_cache:緩存個數

Qcache_not_cached:未被緩存個數

Qcache_lowmem_prunes:因緩存總空間太小,進行修減(騰出老緩存的次數)記憶體的次數。

(2)、命中率名額:

(2.1)、次數命中率:Qcache_hits/(Com_select+Qcache_hits),這個名額隻供參考。

mysql>show global status where variable_name='Qcache_hits' or variable_name='Com_select';

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

| Variable_name | Value |

| Com_select   | 35   |

| Qcache_hits  | 3    |

(2.2)、命中率的一個重要參考名額:命中和寫入的比率,即Qcache_hits/Qcache_inserts的值,

此值如果大于3:1,則表明緩存也是有效,能達到10:1,則比較理想;否則關閉緩存比較好。

7、碎片整理:

    FLUSH QUERY_CACHE

8、清空緩存:

    RESET QUERY_CACHE

9、緩存優化思路:

(1)、批量寫入,可以提高緩存命中率。

(2)、緩存空間不宜過大,否則會因為大量緩存同時失效造成伺服器假死。

(3)、必要時使用SQL_CACHE或SQL_NO_CACHE手動控制緩存。

(4)、對寫密集型應用場景來說,禁用緩存反而提高性能。

本文轉自lzf0530377451CTO部落格,原文連結: http://blog.51cto.com/8757576/1732551,如需轉載請自行聯系原作者