Mysql
在具有 48GB RAM 的伺服器上正確調整 30GB InnoDB 表
我有一個 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。
日誌文件大小
5MB
是innodb_log_file_size的預設大小。Percona 的mysqlperformanceblog.com提供了兩篇關於為您的特定 MySQL 實例計算正確大小的好文章:
- http://www.mysqlperformanceblog.com/2006/07/03/choosing-proper-innodb_log_file_size/
- http://www.mysqlperformanceblog.com/2008/11/21/how-to-calculate-a-good-innodb-log-file-size/
基本上,部落格建議測量一小時內寫入 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”?