Mysql

在具有 48GB RAM 的伺服器上正確調整 30GB InnoDB 表

  • January 17, 2013

我有一個 30GB 15M 行的 InnoDB MySQL 5.5.15 表。它在具有許多其他 MyISAM 表(300GB db)的伺服器上執行。該系統有 48GB RAM。除了預設配置外,我還更改了以下值:

  • InnoDB 緩衝池到 10GB
  • 日誌文件大小 5M

請注意,我key_buffer_size的 MyISAM 是 8GB,我還允許 Memcache 使用 8GB,並安裝了 Redis(不確定他需要多少)。

我應該嘗試配置更多值嗎?

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;

這將顯示如果所有 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'
;

這將為您提供 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;

無論數字返回多少@MB_WL_HR,取一半並將 innodb_log_file_size 調整為它:請參閱我的文章如何安全更改 MySQL innodb 變數“innodb_log_file_size”?

引用自:https://dba.stackexchange.com/questions/23189