有同學在問 mysql中 QueryCache(QC)的鎖是 全局鎖還是 表鎖。這里簡要說明一下。 1、 QC基本概念 這個是實現在MySQL層(非引擎層)的一個內存結構,基本規則是將滿足一定條件的查詢結果緩存在內存中,若同樣的查詢再執行第二次,而且緩存沒有失效,則可以直接返
有同學在問 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中的緩存項而互鎖。
因此是“全局鎖”。