Mysql

是否啟用 MySQL query_cache_size Innodb Lock Safe?

  • June 13, 2014

看起來像是人們通常希望啟用的query_cache_size那種設置,這讓我感到困惑,因為它預設為0. 然後我從 MySQL 文件中閱讀了有關query_cache_wlock_invalidate設置的以下內容

通常,當一個客戶端在 MyISAM 表上獲得 WRITE 鎖時,如果查詢結果存在於查詢記憶體中,則不會阻止其他客戶端發出從表中讀取的語句。將此變數設置為 1 會導致獲取表的 WRITE 鎖,以使查詢記憶體中引用該表的任何查詢無效。這會強制其他嘗試訪問該表的客戶端在鎖定生效時等待。

它沒有提到 InnoDB 引擎。當 Innodb 在行/表上有寫鎖時,此設置是否也阻止從記憶體中讀取?

我很高興您詢問了 InnoDB 和查詢記憶體。

恕我直言,他們永遠不應該出現在同一個句子或同一個對話中。請原諒我在第一句話中使用它們。

不開玩笑了,我在 DBA StackExchange 上講過很多次

這是我Jun 11, 2014關於為什麼應該禁用它的文章(有例外)

根據查詢記憶體狀態的 MySQL 文件

當會話等待獲取查詢記憶體鎖定時會出現此狀態。這可能發生在任何需要執行某些查詢記憶體操作的語句上,例如使查詢記憶體無效的 INSERT 或 DELETE、查找記憶體條目的 SELECT、RESET QUERY CACHE 等等。

這對於 InnoDB 表來說絕對是一個大問題,因為 InnoDB 機制侵入了查詢記憶體。我之前寫過這個現象

您有一些選擇

選項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,但可以根據您的數據集和工作負載智能地調整它的大小。

引用自:https://serverfault.com/questions/604315