如何为mySQL分配内存限制?

MySQL的调谐器报告说,MySQL可以使用安装的RAM的166%,我如何限制RAM的使用?

[!!]最大可能的内存使用量:426.8M(已安装RAM的166%)

你可以configuration

  • 所有MyISAM
  • 所有的InnoDB
  • MyISAM和InnoDB的混合

在将内存分配给任一引擎之前,最好反思一下每个存储引擎的caching情况

configurationMYISAM

使用的主要机制是密钥caching。 它只caching来自.MYI文件的索引页面。 要调整您的密钥caching的大小,请运行以下查询:

SELECT CONCAT(ROUND(KBS/POWER(1024, IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999), SUBSTR(' KMG',IF(PowerOf1024<0,0, IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_key_buffer_size FROM (SELECT LEAST(POWER(2,32),KBS1) KBS FROM (SELECT SUM(index_length) KBS1 FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql')) AA ) A, (SELECT 2 PowerOf1024) B; 

这将给出MyISAM密钥caching的推荐设置( key_buffer_size )给你的当前数据集( 查询将上限为4G(4096M),对于32位操作系统,4GB是限制,对于64位,8GB。

configurationInnoDB

使用的主要机制是InnoDB缓冲池。 它caching来自InnoDB表访问的数据和索引页面。 要调整您的InnoDB缓冲池的大小,请运行以下查询:

 SELECT CONCAT(ROUND(KBS/POWER(1024, IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999), SUBSTR(' KMG',IF(PowerOf1024<0,0, IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables WHERE engine='InnoDB') A, (SELECT 2 PowerOf1024) B; 

这将给出您的当前数据集的InnoDB缓冲池大小的推荐设置( innodb_buffer_pool_size )。

不要忘记调整InnoDB日志文件的大小(ib_logfile0和ib_logfile1)。 MySQL源代码放置所有InnoDB日志文件的组合大小的上限必须<4G(4096M)。 (注意:Percona服务器的二进制文件超过了这个,我最近使用innodb_log_file_size为一个InnoDB日志文件设置了一个4G的大型数据库服务器)

为了简单起见,只给出两个日志文件,下面是如何调整它们的大小:

  • 步骤1)将innodb_log_file_size = NNN添加到/etc/my.cnf(NNN应该是innodb_buffer_pool_size的25%或2047M,以较小者为准)
  • 第2步)服务mysql停止
  • 第3步)rm / var / log / mysql / ib_logfile [01]
  • 第4步)服务mysql启动(重新创buildib_logfile0和ib_logfile1)

警告

在两个查询的最后是一个内联查询: (SELECT 2 PowerOfTwo) B

  • (SELECT 0 PowerOf1024)给出了字节中的设置
  • (SELECT 1 PowerOf1024)以千字节为单位给出设置
  • (SELECT 2 PowerOf1024)以兆字节为单位给出设置
  • (SELECT 3 PowerOf1024)以千兆字节为单位给出设置
  • 没有权力less于0或大于3被接受

结语

没有常识的替代品。 如果内存有限,存储引擎混合或其组合,则必须针对不同的场景进行调整。

如果你有2GB内存和16GB的InnoDB,那么分配512M作为innodb_buffer_pool_size

如果您有2GB内存和4GB的MyISAM索引,请将512M分配为key_buffer_size

如果你有2GB内存和4GB的MyISAM索引和16GB的InnoDB,分配512M作为innodb_buffer_pool_size和512M作为innodb_buffer_pool_size

可能的场景是无尽的!

请记住,无论您分配给DB连接还是操作系统,都需要足够的RAM。

你应该调整my.cnf innodb_buffer_pool_sizeinnodb_buffer_pool_size ,这两个是最重要的内存相关的设置。 要获取当前值,可以使用show variables like 'key_buffer_size';show variables like 'innodb_buffer_pool_size';mysql命令行客户端。

在Myisam引擎的情况下

key_buffer_size +(read_buffer_size + sort_buffer_size)* max_connections

这个值给出了mysql可以消耗的所有可能的内存。这个值应该比你的RAM或接近60%的内存less。 innodb的innodb_buffer_pool_size应该小于你的RAM或者你的ram的60%

调整以上值,使RAM的使用率将是你的RAM的60%。