不是系统管理员,所以...我们在 MySQL 5.0.22 实例上有一个大约 4GB 大小的数据库。表是 InnoDB / UTF-8。基本上有一个针对索引列的查询。硬件有 16GB 内存。理想情况下,我希望管理数据文件和索引文件始终在内存中(写入被刷新到磁盘)。这台服务器上的活动很少。
假设它有足够的内存(我认为确实如此),这应该是无需交换到磁盘的预期行为吗?
我如何确认这种行为正在发生?
提前致谢
答案1
如果您没有运行任何其他占用大量内存的应用程序,那么将您的“工作集”放入内存中应该没有任何问题。完全。我有几个 SQL 服务器就是这么做的。它们提供了出色的读取性能并且没有造成任何麻烦。
要做的事情:
确保 mysql 被告知为 innodb 分配足够的缓冲池 - 在 my.cnf 中输入:
innodb_buffer_pool_size=8GB
假设你没有其他占用大量内存的应用程序 [ Apache / 任何应用程序服务,自定义内容 ] - 最小化可用的交换 [ 关于这个问题有不同的相互矛盾的“学派”。我会放 1GB 的交换 + 监视器,并确保它没有被使用。 ] ; [ 你可以阅读一些关于交换的意见这里]
确保 mysql 在启动后立即“预热”——运行查询,强制 mysql 读取表中的每一行/列。简单:
从表中选择 md5(col1),md5(col2)
应该可以解决问题。重复修改此查询[例如length(col1)]以确保数据确实是从内存中读取的。为了进行更科学的检查,您可以并行运行iostat并确保未触及磁盘。为了更加科学 - 您可能需要查看innodb的统计数据[以确保在执行新版本的查询时没有I / O]通过执行
显示引擎 INNODB 状态\G