MySQL 中 QueryCache 的鎖模型

來源:互聯網
上載者:User

有同學在問 MySQL中 QueryCache(QC)的鎖是 “全域鎖”還是 “表鎖”。這裡簡要說明一下。

1、  QC基本概念

這個是實現在MySQL層(非引擎層)的一個記憶體結構,基本規則是將滿足一定條件的查詢結果緩衝在記憶體中,若同樣的查詢再執行第二次,而且緩衝沒有失效,則可以直接返回查詢結果,無需到引擎擷取資料。

幾個說明:

a) QC的結構是hash,key為查詢字串的原文,因此若想命中QC,要求查詢語句與之前的一模一樣,包括大小寫必須一致、不能增減空格等等。

b) Qc可以緩衝一個表中的多個查詢語句和結果。

c) 對一個表的DML或DDL操作都會將與這個表有關的緩衝都從QC中刪除。

2、  鎖模型

於是說到鎖的粒度。整個QC在記憶體中只有一個執行個體Query_cache query_cache;

我們來看上面c中說到的失效邏輯的部分代碼

  1. void Query_cache::invalidate_table(THD *thd, uchar * key, uint32 key_length)    
  2. {   
  3.   DEBUG_SYNC(thd, “wait_in_query_cache_invalidate1″);   
  4.   
  5.   lock();   
  6.   
  7.   DEBUG_SYNC(thd, “wait_in_query_cache_invalidate2″);    
  8.   
  9.   if (query_cache_size > 0)    
  10.     invalidate_table_internal(thd, key, key_length);   
  11.   
  12.   unlock();    
  13. }   

可以看到這裡lock()沒有參數,函數內部用一額全域訊號量COND_cache_status_changed,來控制。

因此即使兩個dml更新的是不同的表,也會由雩都要失效本表在QC中的快取項目而互鎖。

因此是“全域鎖”。

  • 1
  • 2
  • 下一頁

相關文章

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.