是否啟用 MySQL query_cache_size Innodb Lock Safe?
看起來像是人們通常希望啟用的
query_cache_size
那種設置,這讓我感到困惑,因為它預設為0
. 然後我從 MySQL 文件中閱讀了有關query_cache_wlock_invalidate
設置的以下內容通常,當一個客戶端在 MyISAM 表上獲得 WRITE 鎖時,如果查詢結果存在於查詢記憶體中,則不會阻止其他客戶端發出從表中讀取的語句。將此變數設置為 1 會導致獲取表的 WRITE 鎖,以使查詢記憶體中引用該表的任何查詢無效。這會強制其他嘗試訪問該表的客戶端在鎖定生效時等待。
它沒有提到 InnoDB 引擎。當 Innodb 在行/表上有寫鎖時,此設置是否也阻止從記憶體中讀取?
我很高興您詢問了 InnoDB 和查詢記憶體。
恕我直言,他們永遠不應該出現在同一個句子或同一個對話中。請原諒我在第一句話中使用它們。
不開玩笑了,我在 DBA StackExchange 上講過很多次
Jun 11, 2014
:增加 query_cache_size,隨著流量的增加,查詢速度急劇下降Sep 26, 2013
:查詢記憶體命中值在我的數據庫中沒有改變Sep 05, 2012
:頻繁查詢記憶體失效的成本值得嗎?這是我
Jun 11, 2014
關於為什麼應該禁用它的文章(有例外)當會話等待獲取查詢記憶體鎖定時會出現此狀態。這可能發生在任何需要執行某些查詢記憶體操作的語句上,例如使查詢記憶體無效的 INSERT 或 DELETE、查找記憶體條目的 SELECT、RESET QUERY CACHE 等等。
這對於 InnoDB 表來說絕對是一個大問題,因為 InnoDB 機制侵入了查詢記憶體。我之前寫過這個現象
Sep 05, 2012
: https://dba.stackexchange.com/questions/23699/is-the-overhead-of-frequent-query-cache-invalidation-ever-worth-it/23727#23727Sep 26, 2013
: https://dba.stackexchange.com/questions/50290/query-cache-hit-value-is-not-changing-in-my-database/50535#50535您有一些選擇
選項1
您可以完全禁用查詢記憶體
SET GLOBAL query_cache_size = 0;
如果此後對 InnoDB 表的所有查詢都令人滿意,則將其添加到
my.cnf
[mysqld] query_cache_size = 0;
選項 #2
如果您真的想要更大的查詢記憶體,也許您應該限制條目的大小
- 你可以提高query_cache_min_res_unit。它的預設值為 4K。如果將其設置得更高,這將防止小結果出現在查詢記憶體中。這將減少查詢記憶體中的條目總數。
- 您可能想要更改query_cache_limit。它的預設值為 1M。
更改這些選項可以讓您指定查詢記憶體條目的最小數量。
例如,如果您設置以下
[mysqld] query_cache_size = 2G query_cache_min_res_unit = 64M query_cache_limit = 128M
這將限制查詢記憶體條目的數量
- 最少 16 個(2G / 128M)
- 最大32(2G/64M)
如果您真的了解您的數據工作量和吞吐量,您可以嘗試這些限制。
您的實際問題
是否啟用 MySQL query_cache_size Innodb Lock Safe ?
是的。實際上,當您將查詢記憶體設置得太大時,InnoDB 在這方面可以成為真正的控制狂。雖然對此的總括答案是保留 query_cache_size = 0,但可以根據您的數據集和工作負載智能地調整它的大小。