InnoDB性能调整

时间:2011-03-02 22:35:50

标签: mysql innodb myisam

我正在从myISAM将一个大表切换到InnoDB。关于为什么切换有意义,但关于如何做到这一点并没有太多讨论,同时确保表格表现良好。

假设我在数据库中有InnoDB和MyISAM表,我是否应该在MySQL conf文件中更改参数以提高性能?

任何其他可以提升以调整性能的默认值?

1 个答案:

答案 0 :(得分:21)

您的innodb_buffer_pool_size应设置为您拥有的InnoDB数据和索引的数量。运行此查询,它将告诉您mysql当前Innodb数据的最低建议设置

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

如果您的InnoDB数据远远超过数据库服务器上安装的RAM,我建议在盒子上安装75%的RAM。所以,如果你有16GB的服务器,请使用12G作为innodb_buffer_pool_size。

您还必须将innodb_log_file_size设置为innodb_buffer_pool_size或2047M的25%,它们更小。要更改文件ib_logfile0和ib_logfile1,您必须:

mysql -uroot -p -e"SET GLOBAL innodb_fast_shutdown = 0;"
service mysql stop
rm ib_logfile0 ib_logfile1
service mysql start

如果您使用的是MySQL 5.5,请设置以下内容:

innodb_read_io_threads=64
innodb_write_io_threads=64
innodb_io_capacity=20000 (set this to your device's IOPs)

如果您将保留MyISAM数据,请运行此查询以获取key_buffer_size的理想设置:

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

更新2013-02-13 12:55 EDT

我最近才知道不要将innodb_io_capacity设置得非常高,如果有的话。在商用硬件和虚拟机上尤其如此: