11

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

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

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

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

如果我希望 2 GB 数据库(1 GB 数据和 1 GB 索引)适合 InnoDB 下的内存,我只需innodb_buffer_pool_size2GB. 这两个千兆字节将同时保存数据和索引。

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

我的问题是:

  • MyISAM 的“数据缓冲区大小”(不是索引数据)可以显式配置吗?
  • MyISAM 什么时候从磁盘读取表数据(不包括索引数据),什么时候从内存中读取?
4

1 回答 1

12
  • 没有 MyISAM 没有通用数据缓存。这记录在官方文档的“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 保持在最低限度。

  • 所以回答你的第二个问题:从不。

对于各种 myisam 变量(例如 read_buffer_size、read_rnd_buffer_size、sort_buffer_size、join_buffer_size 等),重要的是不要陷入“缓冲区过大”,因为有些变量是动态分配的,所以更大并不总是意味着更快 - 有时甚至可能更慢 -有关一个非常有趣的案例,请参阅mysqlperformanceblog 上的这篇文章。

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

于 2010-02-12T21:45:39.667 回答