假设数据库由 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
to be 2GB
。这 2 GB 将保存数据和索引。
但是,当设置MyISAM键时key_buffer_size
to 2GB
该空间将用于索引,但不用于数据。
我的问题是:
- MyISAM的“数据缓冲区大小”(不是索引数据)可以显式配置吗?
- MyISAM什么时候会从磁盘读取表数据(不包括索引数据),什么时候会从内存读取?
- 没有MyISAM没有通用数据缓存。这记录在“key_buffer_size”描述中官方文档 http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_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 等,不要陷入“缓冲区过大”的情况,这一点很重要,因为有些变量是动态分配的,所以更大并不总是意味着更快 - 有时甚至可能更慢 -看到这个post http://www.mysqlperformanceblog.com/2006/06/06/are-larger-buffers-always-better/在 mysqlperformanceblog 上有一个非常有趣的案例。
如果您使用的是 posix 平台上的 5.1,您可能需要进行基准测试myisam_use_mmap http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_myisam_use_mmap就您的工作负载而言,它应该通过减少 malloc() 调用的数量来帮助高争用情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)