如何为 mySQL 分配内存限制?

Hac*_*ell 7 mysql ubuntu memory

mysql tuner 报告 mySQL 可以使用 166% 的已安装内存,我如何限制内存使用?

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

Rol*_*DBA 8

您可以配置

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

在为任一引擎分配内存之前,最好考虑一下每个存储引擎的缓存情况

MYISAM配置

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

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;
Run Code Online (Sandbox Code Playgroud)

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

配置InnoDB

使用的主要机制是 InnoDB 缓冲池。它从访问的 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;
Run Code Online (Sandbox Code Playgroud)

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

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

为简单起见,仅给出两个日志文件,您可以通过以下方式调整它们的大小:

  • 步骤1)在/etc/my.cnf中加入innodb_log_file_size=NNN(NNN应该是innodb_buffer_pool_size的25%或2047M,取较小者)
  • 步骤2)服务mysql停止
  • 步骤 3) rm /var/log/mysql/ib_logfile[01]
  • 步骤4)service mysql start(重新创建ib_logfile0和ib_logfile1)

警告

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

  • (SELECT 0 PowerOf1024) 以字节为单位给出设置
  • (SELECT 1 PowerOf1024) 以千字节为单位给出设置
  • (SELECT 2 PowerOf1024) 以兆字节为单位给出设置
  • (SELECT 3 PowerOf1024) 给出以千兆字节为单位的设置
  • 不接受小于 0 或大于 3 的幂

结语

没有什么可以替代常识。如果您的内存有限、混合了存储引擎或它们的组合,则必须针对不同的场景进行调整。

如果您有 2GB RAM 和 16GB InnoDB,则分配 512M 作为innodb_buffer_pool_size.

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

如果您有 2GB RAM 和 4GB MyISAM 索引和 16GB InnoDB,则分配 512M askey_buffer_size和 512M as innodb_buffer_pool_size

可能的场景是无穷无尽的!!!

请记住,无论您分配什么,都要为数据库连接和操作系统留出足够的 RAM。