2017-08-02 26 views
1

可以說我有幾個InnoDB表:如何指示MySQL不緩存內存中的表?

1. table_a 20Gb 
2. table_b 10Gb 
3. table_c 1Gb 
4. table_d 0.5Gb 

而且具有有限內存(8GB)的服務器

我想快速訪問table_c和table_d,並可以允許表-A和表-B慢訪問。

有沒有辦法指示MySQL緩存c,d在內存中,而不是a,b?

(我移動A,B到不同的服務器,但有時我需要一個聯接,C)

+0

你可以用'index'和/或'view'來代替緩存整個表。 –

+0

否。需要對整個數據進行統計計算。 –

回答

1

InnoDB沒有任何選項來指示某些表保留在內存中,而其他表保留內存不足。但這是沒有必要的。

InnoDB通過將它們逐頁加載到緩衝池中來讀取表。您對錶格的使用指導InnoDB將頁面保存在內存中。

偶爾讀一次頁面不太可能將您需要保留在內存中的頁面踢出。 InnoDB爲最近訪問過的頁面保留了緩衝池的一個區域。有一種算法可以將頁面「提升」到這個保留區域中,而不提倡的頁面會先被踢出。

閱讀細節在這裏:https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool.html

如果你真的需要確保某些表在InnoDB緩衝池沒有緩存,那麼唯一途徑是改變這些表的存儲引擎。非InnoDB表(例如MyISAM)永遠不會緩存在InnoDB緩衝池中。但這可能不是切換存儲引擎的充分理由。

1

答覆問題問:第

答到隱含的問題:也許吧。隱含的問題是「我怎樣才能讓查詢運行得更快。這可能會或可能不會有什麼做什麼緩存。

如果您使用索引,尤其是PRIMARY KEY,那麼查詢獲取一行會非常快,即使沒有緩存。如果,另一方面,你做的table_a一個「表掃描」,它會吹熄緩存多次通過20GB掃描。

所以。找出哪個查詢是最慢的,然後讓我們專注於使其更快,這可能就像添加一個「複合」索引一樣簡單,或者可能重新構造查詢,或者可能是其他的東西

VIEWs will not help;它們是圍繞SELECT的句法糖。重新計算統計數據並不是一個「真正的」解決方案。