如何指示 MySQL 不在内存中缓存 table?
How to direct MySQL not to cache a table in memory?
假设我有几个 InnoDB 表:
1. table_a 20Gb
2. table_b 10Gb
3. table_c 1Gb
4. table_d 0.5Gb
以及内存有限 (8Gb) 的服务器
我想要快速访问 table_c 和 table_d,并且可以允许较慢地访问 table_a 和 table_b。
有没有办法直接 MySQL 在内存中缓存 c,d 而不是 a,b?
(我会将 a、b 移动到不同的服务器,但有时我需要加入 a、c)
所问问题的答案:否
隐含问题的答案:可能。隐含的问题是“我怎样才能使 查询 运行 更快。这可能与缓存的内容无关。
如果您使用索引获取一行,尤其是 PRIMARY KEY
,那么查询将非常快,即使 nothing 被缓存。另一方面,如果您执行 table_a
的 "table scan",它将多次耗尽缓存以扫描 20GB。
所以...找出哪个查询最慢,然后让我们专注于使其更快。它可能就像添加一个 "composite" 索引一样简单。或者重新制定查询。或者其他东西。
VIEWs
不会 帮助;它们是 SELECT
周围的语法糖。重新计算统计数据不是 'real' 修复。
InnoDB 没有任何选项可以指示某些表保留在内存中而其他表保留在内存之外。但这有点不必要。
InnoDB 通过将表逐页加载到缓冲池中来读取表。您对表的使用指导 InnoDB 将页面保存在内存中。
偶尔阅读一个页面不太可能踢出您需要保留在内存中的页面。 InnoDB 为最近访问的页面保留缓冲池区域。有一种算法可以将 "promoting" 个页面放入此保留区域,未提升的页面往往会首先被踢出。
在此处阅读详细信息:https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool.html
如果你真的需要确保某些表不缓存在InnoDB缓冲池中,唯一确定的方法是改变这些表的存储引擎。非 InnoDB 表(例如 MyISAM)从不缓存在 InnoDB 缓冲池中。但这可能不是切换存储引擎的充分理由。
假设我有几个 InnoDB 表:
1. table_a 20Gb
2. table_b 10Gb
3. table_c 1Gb
4. table_d 0.5Gb
以及内存有限 (8Gb) 的服务器
我想要快速访问 table_c 和 table_d,并且可以允许较慢地访问 table_a 和 table_b。
有没有办法直接 MySQL 在内存中缓存 c,d 而不是 a,b?
(我会将 a、b 移动到不同的服务器,但有时我需要加入 a、c)
所问问题的答案:否
隐含问题的答案:可能。隐含的问题是“我怎样才能使 查询 运行 更快。这可能与缓存的内容无关。
如果您使用索引获取一行,尤其是 PRIMARY KEY
,那么查询将非常快,即使 nothing 被缓存。另一方面,如果您执行 table_a
的 "table scan",它将多次耗尽缓存以扫描 20GB。
所以...找出哪个查询最慢,然后让我们专注于使其更快。它可能就像添加一个 "composite" 索引一样简单。或者重新制定查询。或者其他东西。
VIEWs
不会 帮助;它们是 SELECT
周围的语法糖。重新计算统计数据不是 'real' 修复。
InnoDB 没有任何选项可以指示某些表保留在内存中而其他表保留在内存之外。但这有点不必要。
InnoDB 通过将表逐页加载到缓冲池中来读取表。您对表的使用指导 InnoDB 将页面保存在内存中。
偶尔阅读一个页面不太可能踢出您需要保留在内存中的页面。 InnoDB 为最近访问的页面保留缓冲池区域。有一种算法可以将 "promoting" 个页面放入此保留区域,未提升的页面往往会首先被踢出。
在此处阅读详细信息:https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool.html
如果你真的需要确保某些表不缓存在InnoDB缓冲池中,唯一确定的方法是改变这些表的存储引擎。非 InnoDB 表(例如 MyISAM)从不缓存在 InnoDB 缓冲池中。但这可能不是切换存储引擎的充分理由。