MySQL查詢快取詳解

來源:互聯網
上載者:User

標籤:mysql查詢快取


MySQL查詢快取    

     用於儲存MySQL查詢語句返回的完整結果,被命中時,

     MySQL會立即返回結果,省去解析、最佳化和執行等階段


並發查詢量非常大、cup核心數非常多時緩衝並不一定有效

(多個線程會爭用儲存緩衝的這段記憶體空間)



如何檢查緩衝???

    MySQL儲存結果與緩衝中:

       把select語句本身做hash計算,計算的結果作為key,查詢結果作為value


什麼樣的語句不會被緩衝?

    查詢語句中有一些不確定資料時,不會緩衝;例如now(),current_time();

    一般來說,如果查詢中包含使用者自訂函數、儲存函數、使用者變數、暫存資料表、mysql庫中系統資料表、或者任何包含許可權的表,一般都不會緩衝


緩衝會帶來額外開銷

    1、每個查詢都會先檢查是否命中

    2、查詢結果要先緩衝(寫緩衝)


查看跟緩衝相關的變數

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      |+------------------------------+----------+query_cache_type:查詢快取類型:是否開啟緩衝功能,開啟方式有三種{ON|OFF|DEMAND}   DEMAND:意味著select語句明確使用sql_cache選項才會緩衝 (SQL_NO_CACHE則不會緩衝)query_cache_size:總空間;單位為位元組,大小必須為1024的整數倍.mysql啟動時,會一次分配並立即初始化這裡指定大小的記憶體空間;   這意味著,如果修改此大小,會清空緩衝並重新初始化的.query_cache_min_res_unit:儲存緩衝的最小記憶體塊;(query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache 能夠獲得一個理想的值   設定過大,容易浪費;設定過小,容易產生大量片段query_cache_limit:單個緩衝對象的最大值,超出時則不予緩衝;手動使用SQL_NO_CACHE可以人為的避免嘗試緩衝返回超出此參數限定值得語句query_cache_wlock_invalidate:如果某個表被其他使用者串連鎖住了,是否仍然從緩衝中返回結果,OFF表示返回



如何判斷命中率:

    分為次數和位元組命中率(命中以後,所省去的資料轉送量或解析本身所開銷的大小)


mysql> show global status like ‘Qcache%‘;+-------------------------------------------------+----------+| Variable_name                                   | Value    |+-------------------------------------------------+----------+| Qcache_free_blocks(空閑塊數)                  | 1        || Qcache_free_memory(空閑空間)                  | 16759688 || Qcache_hits(叫用次數)                         | 0        || Qcache_inserts (插入次數)                       | 2        || Qcache_lowmem_prunes(記憶體太小,修剪記憶體的次數) | 0        || Qcache_not_cached(沒被緩衝的個數)             | 8        || Qcache_queries_in_cache(緩衝中緩衝的查詢個數) | 0        || Qcache_total_blocks(總塊數)                   | 1        |+-------------------------+----------------------------------+


磁碟重組 mysql > flush query_cache

清空緩衝 mysql > reset query_cache


計算命中率:

mysql > show global status where Vaiable_name=‘Qcache_hits‘ OR Variable_name=‘Com_Select‘;

Qcache_hits/(Qcache_hits + Com_Select)


mysql> show global status where Variable_name=‘Qcache_hits‘ OR Variable_name=‘Com_Select‘;+---------------+-------+| Variable_name | Value |+---------------+-------+| Com_select    | 25    | // 總查詢此時,命中則不會累計| Qcache_hits   | 3     |+---------------+-------+命中率=3/(3+25)




緩衝最佳化思路

    1.批量寫入,而非多次單個寫入

    2.緩衝空間不宜過大,因為大量緩衝同事失效時會導致伺服器假死

    3.必要時,使用sql_CACHE和sql_no_cache手動控制緩衝。

    4.對寫密集型的應用情境來說,禁用緩衝反而提高效能。


本文出自 “似水流年” 部落格,請務必保留此出處http://sixijie123.blog.51cto.com/11880770/1883864

MySQL查詢快取詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.