MySQL 中 QueryCache 的鎖模型

有同學在問 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中的緩存項而互鎖。

因此是“全局鎖”。

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享