2017-08-02 53 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的句法糖。重新计算统计数据并不是一个“真正的”解决方案。