2011-03-02 41 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