充其量,它们可能会给你“有趣的东西”来调查和阅读,但是如果不了解该服务器上数据的性质,就绝对不可能正确“调整” MySQL 服务器......而且,你只是可能会向下和向上调整你的表现。
InnoDB 不会将任何无用的东西加载到缓冲池中。让新重新启动的 MySQL 服务器不运行任何查询,缓冲池将坐在那里,已分配但大部分是空的。 SELECT来自一个表,并且磁盘上该表的表空间中的一些页面将被加载到池中,但通常不会全部加载。哪些页面取决于您检索哪些行,需要哪些索引才能找到它们,是否正在执行预读等。
mysql> show global status like 'innodb_buffer_pool_read%s';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| Innodb_buffer_pool_read_requests | 151062817 |
| Innodb_buffer_pool_reads | 3585 |
+----------------------------------+-----------+
或者页面点击率:
mysql> show engine innodb status\G
...
----------------------
BUFFER POOL AND MEMORY
----------------------
...
Buffer pool hit rate 999 / 1000, young-making rate 36 / 1000 not 0 / 1000
...
您的问题的答案的第 1 部分是否定的,您不能有选择地告诉 MySQL 什么不要存储在 InnoDB 缓冲池中。它是 InnoDB 如何操作表数据的一个组成部分。
第 2 部分是您并不真正想要或不需要这样做,因为如果池不足以保留整个数据集,它足够聪明地计算出应该保留的内容。
顺便说一句,我之前可能提到过……不要相信调整脚本。
充其量,它们可能会给你“有趣的东西”来调查和阅读,但是如果不了解该服务器上数据的性质,就绝对不可能正确“调整” MySQL 服务器......而且,你只是可能会向下和向上调整你的表现。
InnoDB 不会将任何无用的东西加载到缓冲池中。让新重新启动的 MySQL 服务器不运行任何查询,缓冲池将坐在那里,已分配但大部分是空的。
SELECT
来自一个表,并且磁盘上该表的表空间中的一些页面将被加载到池中,但通常不会全部加载。哪些页面取决于您检索哪些行,需要哪些索引才能找到它们,是否正在执行预读等。UPDATE
一个表和包含您更新的行的页面将被加载到池中,在池中进行修改,然后在后台写回磁盘。INSERT
并将DELETE
页面带入池中并最终将它们也刷新回磁盘。但是 InnoDB 会跟踪缓冲池中当前的“有用”程度、最近需要它的时间、是否已将任何更改写回磁盘,并且会在缓冲池结束时驱逐页面为其他页面腾出空间满的。我的许多生产服务器都有一个小于服务器数据集的 InnoDB 缓冲池,并且基本上 100% 的时间是 100% 满的,但是当大量数据没有被访问一段时间时,不会对性能产生影响时间。
如果池中的页面自加载后未更改,或者已更改但从那时起已将更改写回磁盘,并且有一段时间不需要它,则下次 InnoDB 想要从磁盘将某些内容加载回池中时,池很容易重用于其他内容......所以它“正在使用”但仍然“可用”。
除非您经常访问所有 50GB 的这些 blob,否则调整脚本的大小建议被夸大了。当然,在理想情况下,您的池将大于所有表和索引,并且您将拥有一个只需要访问磁盘即可刷新更改的全内存数据库......但在现实中在真实数据的世界中,很可能您的大部分数据不经常访问,并且简单的脚本无法预测这些情况。
InnoDB 缓冲池存储存储在磁盘上的数据库页面中的任何内容的副本。那包含着:
您无法排除其中一种页面。它们都根据需求不时占用缓冲池。
所以严格来说,如何从缓冲池中排除 InnoDB Blob 数据的问题的唯一答案是使用不同的存储引擎。
您还可以从查询中排除 Blob/Text/Varchar 列。只是不要在查询中引用这些列(避免使用
SELECT *
)。InnoDB 足够聪明,可以跳过加载不需要的 Blob/Text/Varchar 数据的额外页面。但是您应该对 mysqltuner 等工具的推荐持保留态度。您不一定需要与数据总量一样多的缓冲池。事实上,更典型的情况是您有一个 80/20 规则:80% 的查询由 20% 的数据提供服务。
您的里程可能会有所不同——您运行的查询类型决定了缓冲池大小的最佳折衷方案。您可以给它一个最佳猜测分配,然后监控逻辑页面读取与物理页面 I/O 的比率:
或者页面点击率:
如果您不喜欢这些比率,请为缓冲池分配更多 RAM。