可以說我有幾個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)
可以說我有幾個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)
InnoDB沒有任何選項來指示某些表保留在內存中,而其他表保留內存不足。但這是沒有必要的。
InnoDB通過將它們逐頁加載到緩衝池中來讀取表。您對錶格的使用指導InnoDB將頁面保存在內存中。
偶爾讀一次頁面不太可能將您需要保留在內存中的頁面踢出。 InnoDB爲最近訪問過的頁面保留了緩衝池的一個區域。有一種算法可以將頁面「提升」到這個保留區域中,而不提倡的頁面會先被踢出。
閱讀細節在這裏:https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool.html
如果你真的需要確保某些表在InnoDB緩衝池沒有緩存,那麼唯一途徑是改變這些表的存儲引擎。非InnoDB表(例如MyISAM)永遠不會緩存在InnoDB緩衝池中。但這可能不是切換存儲引擎的充分理由。
答覆問題問:第
答到隱含的問題:也許吧。隱含的問題是「我怎樣才能讓查詢運行得更快。這可能會或可能不會有什麼做什麼緩存。
如果您使用索引,尤其是PRIMARY KEY
,那麼查詢獲取一行會非常快,即使沒有緩存。如果,另一方面,你做的table_a
一個「表掃描」,它會吹熄緩存多次通過20GB掃描。
所以。找出哪個查詢是最慢的,然後讓我們專注於使其更快,這可能就像添加一個「複合」索引一樣簡單,或者可能重新構造查詢,或者可能是其他的東西
VIEWs
will not help;它們是圍繞SELECT
的句法糖。重新計算統計數據並不是一個「真正的」解決方案。
你可以用'index'和/或'view'來代替緩存整個表。 –
否。需要對整個數據進行統計計算。 –