如何指导MySQL不在内存中缓存表?

如何指导MySQL不在内存中缓存表?,mysql,caching,innodb,Mysql,Caching,Innodb,假设我有几个InnoDB表: 1. table_a 20Gb 2. table_b 10Gb 3. table_c 1Gb 4. table_d 0.5Gb 以及内存有限的服务器(8Gb) 我希望快速访问表c和表d,并允许以较慢的速度访问表a和表b 有没有办法让MySQL在内存中缓存c,d,而不是a,b (我会将a、b移动到不同的服务器,但有时我需要在a、c上加入)对问题的回答:否 对隐含问题的回答:可能。隐含的问题是“如何使查询运行得更快。这可能与缓存的内容有关,也可能与缓存的内容无关。”

假设我有几个InnoDB表:

1. table_a 20Gb
2. table_b 10Gb
3. table_c 1Gb
4. table_d 0.5Gb
以及内存有限的服务器(8Gb)

我希望快速访问表c和表d,并允许以较慢的速度访问表a和表b

有没有办法让MySQL在内存中缓存c,d,而不是a,b


(我会将a、b移动到不同的服务器,但有时我需要在a、c上加入)

对问题的回答:否

对隐含问题的回答:可能。隐含的问题是“如何使查询运行得更快。这可能与缓存的内容有关,也可能与缓存的内容无关。”

如果使用索引获取一行,特别是
主键
,那么即使没有缓存任何内容,查询也会非常快。另一方面,如果对
table_a
执行“表扫描”,它会多次清空缓存以扫描20GB

所以…找出哪一个查询最慢,然后让我们集中精力让它更快。它可能像添加“复合”索引一样简单。或者可能重新格式化查询。或者可能是其他什么


视图
没有帮助;它们是
选择
的语法糖。重新计算统计数据不是一个“真正的”修复。

InnoDB没有任何选项来指示某些表保留在内存中,而其他表保留在内存之外。但这是不必要的

InnoDB通过将表逐页加载到缓冲池中来读取表。您对表的使用指导InnoDB将页保留在内存中

偶尔读取一个页面不太可能将需要保留在内存中的页面踢出。InnoDB保留缓冲池中的一个区域,供最近访问的页面使用。有一种算法可以将页面“升级”到该保留区域,而未升级的页面往往会先被踢出

请在此处阅读详细信息:


如果您确实需要确保某些表未缓存在InnoDB缓冲池中,唯一确定的方法是更改这些表的存储引擎。非InnoDB表(例如MyISAM)从不缓存在InnoDB缓冲池中。但这可能不是切换存储引擎的充分理由。

您可能可以使用
索引和/或
视图来代替缓存整个表。不需要对整个数据运行统计计算。