Mysql

禁止 MariaDB 查詢記憶體,除了來自網路伺服器 (JDBC)

  • May 20, 2017

我有一個應用程序伺服器(Play Framework)、Web 伺服器(Caddy)和數據庫伺服器(MariaDB 和 InnoDB),它們現在在一台機器上執行。

數據庫有兩種使用方式:

  • 進行高度特定的 SELECT 的客戶端 Python 程式碼(通過 SSH 隧道)。
  • Web/應用程序伺服器,它偶爾執行INSERT 和 UPDATE,但每次載入頁面時主要從大型表中選擇。

是否有一種簡單的方法可以為 Web 伺服器啟用(並強制)查詢記憶體,而不是為客戶端程式碼啟用查詢記憶體?我的想法是在網路伺服器上設置query_cache_type=DEMAND和使用SQL_CACHE,但這並不理想。也許我可以強制 JDBC 以SQL_CACHE某種方式使用?

澄清:SQL_CACHE添加到每個查詢 的不幸技術問題是 Web 應用程序使用Slick和 JDBC 後端進行查詢。與 Slick 的集成很緊密,所以我無法重寫應用層,也不知道如何強制 JDBC 附加SQL_CACHE.

如果有很多寫活動,查詢記憶體實際上是無用的——因為當表發生任何修改時,表的所有QC 條目都會被清除。

如果 QC 有用,則使用query_cache_type=DEMAND 手動說SQL_CACHEor SQL_NO_CACHEon everySELECT 可能是最佳選擇。這可以防止罕見的、龐大的查詢使記憶體變得混亂,同時允許“好”的查詢使用 QC。注意:這與連接器(JDBC 等)無關,僅與SELECT語句有關。

是的,DEMAND沒有SQL_CACHE導致不使用 QC。我同意這是“不理想的”,因為它取決於關於 QC 的不明顯規則。不過,這可能是您最好的解決方案,除了…

如果一個查詢很慢很慢很重要,我們應該批判性地看待這個查詢。加速可能就像添加一個“複合”索引一樣簡單,或者對查詢進行一些看似微小的調整,例如不在函式呼叫中隱藏索引列(例如,DATE(dt) = ...)。

引用自:https://dba.stackexchange.com/questions/174126