mysql – 将数据加上内存中的索引数据 – InnoDB与MyISAM

假设由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_size配置为2GB.两千兆字节将保存数据和索引.

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

我的问题是:

> MyISAM的“数据缓冲区大小”(不是索引数据)可否被明确配置?
> MyISAM何时从磁盘读取表数据(不包括索引数据),何时从内存中读取?

最佳答案
> No MyISAM没有通用数据缓存.这在the official documentation的“key_buffer_size”描述中有记录:这是因为MySQL依赖于操作系统来执行文件系统缓存以进行数据读取,因此您必须为文件系统缓存留出空间.

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

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

对于各种myisam变量(如read_buffer_size,read_rnd_buffer_size,sort_buffer_size,join_buffer_size等),对于某些动态分配来说,也不要属于“缓冲区超大”,所以更大并不总是意味着更快 – 有时甚至可能更慢 – 看到这个post在mysqlperformanceblog上有一个非常有趣的情况.

如果您在posix平台上使用5.1,则可能需要对工作负载进行基准测试,因为它可以通过减少malloc()调用的数量来帮助高竞争的情况.

转载注明原文:mysql – 将数据加上内存中的索引数据 – InnoDB与MyISAM - 代码日志