在具有 48GB RAM 的服务器上正确调整 30GB InnoDB 表

Noa*_*oam 5 mysql innodb myisam database-design configuration

我有一个 30GB 15M 行的 InnoDB MySQL 5.5.15 表。它在具有许多其他 MyISAM 表 (300GB db) 的服务器上运行。该系统具有48GB RAM。除了默认配置之外,我还更改了以下值:

  • InnoDB 缓冲池到 10GB
  • 日志文件大小 5M

请注意,我key_buffer_size的 MyISAM 是 8GB,我还允许 Memcache 使用 8GB,并安装了 Redis(不确定他需要多少)。

我还应该尝试配置更多值吗?

Rol*_*DBA 8

MyISAM 密钥缓存

你说你的key_buffer_size为8GB。

问题:你真的有 8GB 的​​ MyISAM 索引吗?

请运行此查询

SELECT
    KBS/power(1024,0) KBS_BB,
    KBS/power(1024,1) KBS_KB,
    KBS/power(1024,2) KBS_MB,
    KBS/power(1024,3) KBS_GB
FROM
(
    SELECT SUM(index_length) KBS
    FROM information_schema.tables
    WHERE engine='MyISAM' AND table_schema NOT IN
    ('information_schema','performance_schema','mysql')
) A;
Run Code Online (Sandbox Code Playgroud)

这将显示如果所有 MYI 页面都已加载,您的 key_buffer_size需要多大。要获得逼真的图片,请运行这些:

SELECT
   FLOOR((A.variable_value * B.variable_value)/power(1024,2)+0.5) KBS_USED_IN_MB
FROM
   information_schema.global_variables A,
   information_schema.global_status B
WHERE
   A.variable_name = 'key_cache_block_size' AND
   B.variable_name = 'Key_blocks_used'
;
Run Code Online (Sandbox Code Playgroud)

这将为您提供 key_buffer_size 正在使用的 MB(兆字节)数。您应该将其四舍五入到最近的 GB。

日志文件大小

5MBinnodb_log_file_size的默认大小。Percona 的mysqlperformanceblog.com提供了两篇关于为您的特定 MySQL 实例计算合适大小的好文章:

基本上,该博客建议测量一小时内写入 InnoDB 日志文件的字节数。这就是我想弄清楚的

SET @TimeInterval = 3600;
SELECT variable_value INTO @num1 FROM information_schema.global_status
WHERE variable_name = 'Innodb_os_log_written';
SELECT SLEEP(@TimeInterval);
SELECT variable_value INTO @num2 FROM information_schema.global_status
WHERE variable_name = 'Innodb_os_log_written';
SET @ByteWrittenToLog = @num2 - @num1;
SET @KB_WL_HR = @ByteWrittenToLog / POWER(1024,1) * 3600 / @TimeInterval;
SET @MB_WL_HR = @ByteWrittenToLog / POWER(1024,2) * 3600 / @TimeInterval;
SET @GB_WL_HR = @ByteWrittenToLog / POWER(1024,3) * 3600 / @TimeInterval;
SELECT @KB_WL_HR,@MB_WL_HR,@GB_WL_HR;
Run Code Online (Sandbox Code Playgroud)

无论返回什么数字@MB_WL_HR,取一半并将 innodb_log_file_size 调整为它:请参阅我的帖子如何安全地更改 MySQL innodb 变量“innodb_log_file_size”?