假设数据库包含1 GB数据和1 GB索引数据。
为了最小化磁盘IO并因此最大化性能,我想为MySQL分配内存,以便包括索引在内的整个数据集可以保存在RAM中(假设机器有大量RAM)。
InnoDB参数innodb_buffer_pool_size
用于指定InnoDB用于缓存其表的数据和索引的内存缓冲区的大小。 (注意:内存用于数据 AND 索引。)
MyISAM参数key_buffer_size
用于指定MyISAM用于缓存其表的索引的内存缓冲区的大小。 (注意:内存仅用 表示索引。)
如果我希望2 GB数据库(1 GB数据和1 GB索引)适合InnoDB下的内存,我只需将innodb_buffer_pool_size
配置为2GB
即可。两千兆字节将保存数据和索引。
但是,将MyISAM密钥key_buffer_size
设置为2GB
时,该空间将用于索引,但不会用于数据。
我的问题是:
答案 0 :(得分:12)
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上的post以获取一个非常有趣的案例。
如果您在posix平台上使用5.1,则可能需要对工作负载进行myisam_use_mmap基准测试,它应该通过减少malloc()调用的数量来帮助解决高争用情况。