Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在内存中保留数据和索引数据-InnoDB与MyISAM_Mysql_Database_Performance_Innodb_Myisam - Fatal编程技术网

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

Mysql 在内存中保留数据和索引数据-InnoDB与MyISAM,mysql,database,performance,innodb,myisam,Mysql,Database,Performance,Innodb,Myisam,假设数据库由1GB数据和1GB索引数据组成 为了最大限度地减少磁盘IO,从而最大限度地提高性能,我想为MySQL分配内存,这样整个数据集(包括索引)都可以保存在RAM中(假设机器有大量RAM) InnoDB参数InnoDB_buffer_pool_size用于指定InnoDB用于缓存数据及其表索引的内存缓冲区大小。(注意:内存用于数据和索引。) MyISAM参数key\u buffer\u size用于指定MyISAM用于缓存其表索引的内存缓冲区的大小。(注意:内存仅用于索引。) 如果我想将2G

假设数据库由1GB数据和1GB索引数据组成

为了最大限度地减少磁盘IO,从而最大限度地提高性能,我想为MySQL分配内存,这样整个数据集(包括索引)都可以保存在RAM中(假设机器有大量RAM)

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

MyISAM参数
key\u buffer\u size
用于指定MyISAM用于缓存其表索引的内存缓冲区的大小。(注意:内存仅用于索引。)

如果我想将2GB数据库(1GB数据和1GB索引)放入InnoDB下的内存中,我只需将
InnoDB\u buffer\u pool\u size
配置为
2GB
。两个千兆字节将同时保存数据和索引

但是,当将MyISAM键设置为
key\u buffer\u size
2GB
时,该空间将用于索引,但不用于数据

我的问题是:

  • MyISAM的“数据缓冲区大小”(不是索引数据)可以显式配置吗
  • MyISAM何时从磁盘读取表数据(不包括索引数据),何时从内存读取
      • 没有MyISAM没有通用数据缓存。这在“key\u buffer\u size”的描述中有记录:
        这是因为MySQL依赖于操作系统来执行文件系统缓存以进行数据读取,因此您必须为文件系统缓存留出一些空间。
      现代操作系统,尤其是Linux,倾向于拥有非常智能的虚拟内存子系统,将频繁访问的文件保存在页面缓存中,因此当工作集适合可用内存时,磁盘I/O保持在最低水平

      • 所以要回答你的第二个问题:永远不要
      对于各种myisam变量,如读取缓冲区大小、读取缓冲区大小、排序缓冲区大小、连接缓冲区大小等,不要陷入“缓冲区过大”的境地,这一点很重要,因为有些变量是动态分配的,因此,更大并不总是意味着更快——有时甚至可能更慢——请参阅mysqlperformanceblog上的这篇文章,了解一个非常有趣的案例

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