2011-03-02 69 views
10

我从myISAM切换到InnoDB的一个大表。关于为什么切换有意义,有很多讨论,但没有太多关于如何做,而确保表格表现良好。InnoDB性能调整

假设我将数据库中的InnoDB和MyISAM表,是否有参数我应该在MySQL配置文件中更改,以促进更好的性能?

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

+4

吨。阅读手册和MySQL性能博客。如果您要使用两个存储引擎,则需要为两者设置所有参数。对于InnoDB,从缓冲池大小和事务提交类型开始。 – 2011-03-02 22:39:04

+0

什么意思是大桌子(多少演出?)?你使用什么操作系统? – Sacx 2011-03-17 10:30:07

回答

19

您的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的数据远远超过了DB服务器上安装的RAM,我建议在包装盒上所安装的RAM的75%。所以,如果你有一个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; 

UPDATE 2013年2月13日12:55 EDT

我有如果有的话,最近学会不要设置非常高的innodb_io_capacity。这是在商用硬件和虚拟机更是如此:他们的

+0

这真棒,感谢您的查询!问题:你为什么只给innodb_io_capacity @ 20000提供一揽子建议?该数字不应该与服务器的磁盘IOPS匹配吗? – 2013-02-15 04:31:09

+0

@ClaytonDukes你是绝对正确的。我有一个这种硬件的虚拟主机客户端。对不起,极端的数字。 – RolandoMySQLDBA 2013-02-15 16:07:57