我正在使用 MySQL 进行一些实验,数据库大小为几 GB。我发现了一件有趣的事情:当 MySQL 运行时,Windows 不会缓存数据库所包含的 .ibd 文件。例如,我运行查询,查看 Windows 如何主动从驱动器读取。我多次同时将 FAR Manager 中的相应文件复制到 nul,每次都从驱动器读取它们。
我可以在 Windows 7 的资源监视器中看到,在读取文件时缓存内存如何增加,在读取完成后又如何回落。有时我看到暂停一个 FAR 中的复制如何有助于读取其他 FAR :) 但这不是必须的。如果 MySQL 服务已关闭,缓存将正常工作 - 例如,如果表的 .ibd 文件为 200 MB,并且有 1 GB 的可用 RAM 或至少缓存 RAM,则在读取一两次后会缓存它。
为什么会发生这种情况?可以解决这个问题吗?
这是我用于一切和开发的笔记本,所以我不想为 MySQL 分配太多内存(也许 200 MB 可以,但 500 MB 太多了)。Windows 7 x64、Core i5、8 GB RAM、混合 SSHD(1 TB HDD + 8 GB 闪存)、大约 8 GB ReadyBoost 缓存、InnoDB 表(默认,我不是 MySQL 专家)。我想 ReadyBoost 很有帮助。我看到系统向 ReadyBoost.sfcache 文件写入大量数据(比如 500 KB/s)并读取大量数据(1-5 MB/s)。
答案1
我发现解决方案对我来说非常好:我升级到最新的 MySQL 5.7,现在可以动态更改池大小:
set global innodb_buffer_pool_size = 512 * 1024 * 1024;
当池大小足够大时(例如在大量插入期间),性能提升非常大。
我在升级过程中遇到了很多麻烦(MySQL 5.7 不接受 5.5 的数据库,mysql_upgrade 甚至无法启动,MySQL Front 崩溃等等)。但在某些情况下(池大小相同),5.7 的性能似乎也更高。