首页 文章

将数据和索引数据保存在内存中 - InnoDB与MyISAM

提问于
浏览
11

假设一个由1 GB数据和1 GB索引数据组成的数据库 .

为了最小化磁盘IO并因此最大化性能,我想为MySQL分配内存,以便包括索引在内的整个数据集可以保存在RAM中(假设机器有大量RAM) .

InnoDB参数 innodb_buffer_pool_size 用于指定InnoDB用于缓存其表的数据和索引的内存缓冲区的大小 . (注意:内存用于数据 AND 索引 . )

MyISAM参数 key_buffer_size 用于指定MyISAM用于缓存其表的索引的内存缓冲区的大小 . (注意:对于索引,内存使用 ONLY . )

如果我希望2 GB数据库(1 GB数据和1 GB索引)适合InnoDB下的内存,我只需将 innodb_buffer_pool_size 配置为 2GB . 两千兆字节将保存数据和索引 .

但是,将MyISAM键 key_buffer_size 设置为 2GB 时,该空间将用于索引,但不会用于数据 .

我的问题是:

  • 可以明确配置MyISAM的"data buffer size"(非索引数据)吗?

  • MyISAM何时从磁盘读取表数据(不包括索引数据)以及何时从内存中读取?

1 回答

  • 12
    • 没有MyISAM没有通用数据缓存 . 这在"key_buffer_size"中的"key_buffer_size"描述中记录: This is because MySQL relies on the operating system to perform file system caching for data reads, so you must leave some room for the file system cache.

    现代操作系统,尤其是Linux,往往具有非常智能的虚拟内存子系统,可以将频繁访问的文件保存在页面缓存中,因此当工作集适合可用内存时,磁盘I / O保持在最低限度 .

    • 所以回答你的第二个问题:永远不要 .

    它总是意味着更快 - 有时甚至可能更慢 - 请参阅mysqlperformanceblog上的post以获得一个非常有趣的案例 .

    如果你在posix平台上使用5.1,你可能想要在工作负载上对myisam_use_mmap进行基准测试,它应该通过减少malloc()调用的数量来帮助解决高争用情况 .

相关问题