2011-05-05 108 views
1

我是MySQL的新手,我對InnoDB的性能有些懷疑。我有一個表,我想儲存一些措施,我在存儲過程中使用一個循環測試密集插入:MySQL InnoDB插入性能(Windows)

CREATE TABLE `measures` (
    `Id` int(10) unsigned NOT NULL, 
    `DT` datetime NOT NULL, 
    `TF1` float DEFAULT '0', 
    `IF1` float DEFAULT '0', 
    `PAF1` float DEFAULT '0', 
    `PRF1` float DEFAULT '0', 
    `CF1` float DEFAULT '0', 
    `TF2` float DEFAULT '0', 
    `IF2` float DEFAULT '0', 
    `PAF2` float DEFAULT '0', 
    `PRF2` float DEFAULT '0', 
    `CF2` float DEFAULT '0', 
    `TF3` float DEFAULT '0', 
    `IF3` float DEFAULT '0', 
    `PAF3` float DEFAULT '0', 
    `PRF3` float DEFAULT '0', 
    `CF3` float DEFAULT '0', 
    `CTotal` float DEFAULT '0', 
    PRIMARY KEY (`Id`,`DT`), 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE PROCEDURE `sp_INSERT_TEST`() 
BEGIN 
     DECLARE i INT DEFAULT 1; 

     WHILE (i<=6000) DO 

      INSERT INTO measures 
      (Id, DT, TF1, IF1, PAF1, PRF1, CF1, TF2, IF2, PAF2, PRF2, CF2, 
TF3, IF3, PAF3, PRF3, CF3, CTotal) 
      VALUES 
      (1, TIMESTAMPADD(MINUTE,i, NOW()), 
      0.1, 1, 10, 100, 1000, 
      0.2, 2, 20, 200, 2000, 
      0.3, 3, 30, 300, 3000, 
      i * 10); 

      SET i=i+1; 
     END WHILE; 
END 

執行的總時間大約是150秒,但如果我使用MyISAM代替InnoDB,時間約爲0.2秒

這兩個引擎之間的性能差異是否正常?是否有可能使用InnoDB來改進插入以接近MyISAM性能或者它是一個引擎限制?

注:我使用的MySQL 56年5月1日(64位)Windows 7的64位,與開發商機默認配置(我也試過服務器的配置,但性能接近)。

在此先感謝。 約翰

回答

1

InnoDB通常比MyISAM慢,是一個具有ACID屬性的事務性數據庫引擎。但是,更改配置或做事的方式會對速度產生重大影響。

首先不起作用的是:添加緩存毫無用處,減少了表上索引的數量有所幫助,因爲插入時必須創建較少的索引,但在您的情況下只有主鍵。

我的建議是嘗試下列之一:

  • 運行在一個事務中所有INSERT查詢,然後提交底。

    例如:SET autocommit = 0; INSERT語句; COMMIT;

  • 使用擴展插入語句,允許插入許多行,在一起。我認爲InnoDB不支持,但我只是嘗試MySQL 5.0.75,它的工作。我不認爲你可以一次插入所有6000行,因爲你受到max_allowed_pa​​cket的限制(如果你願意,你可以增加它)。例如,您可以一次插入500行。

    實施例:INSERT INTO表(FIELD1,FIELD2) VALUES (1,試驗'), (2, '你好');

+0

使用擴展插入語句讓MySQL的做多插入事務中,即使自動提交已關閉。所以,是的,這是一個好主意。 – MarkR 2011-05-06 18:13:59

+0

我不同意你的第一個陳述「Innodb表現相當差」。沒有支持其競爭通用工作的功能集的開源引擎,所以我認爲你可能是錯的。 – MarkR 2011-05-06 18:14:50

+0

@MarkR我不是故意打擊InnoDB,也許我可以將它改爲「比MyISAM慢得多」。至於替代什麼PostgreSQL呢? – stivlo 2011-05-06 18:21:10

1

是的,這是正常的。和所有的事務性數據庫一樣,InnoDB必須確保ACID的一致性,這需要花費很多工作量,而且還會影響性能,因爲在每次事務結束時,必須等待硬盤寫入「確定數據已寫入」,至於ACID中的「D =耐久性」。

解決方案僅僅是在單個事務中發出批量INSERT,即BEGIN,批量INSERT,COMMIT。

或者使用更適合的東西,比如LOAD DATA INFILE,或者至少使用多行INSERT。

-2

MyISAM在插入時速度比InnoDB快,但不會超過750倍,這表明您需要進行InnoDB調優。 這是一個前面已經討論過的話題,例如,您可以在following blog上閱讀一些好東西。

3

就像peufeu說,只用一個事務就可以提高性能。如果您願意放寬ACID,您可以通過在my.ini中設置

innodb_flush_log_at_trx_commit=0 

來獲得更好的性能。

0

其他海報是正確的 - 在一次交易中完成所有事情。

6000行就是這樣一個小表,插入性能對於這樣一個微小的數據集並不真正相關。

無論如何,沒有現代數據庫針對這種「玩具」系統進行了優化。

嘗試十億條記錄,並用合理大小的交易記錄,然後看誰贏了。

的拔出插頭,看看誰更快速恢復(提示:它不會是MyISAM的)

使用LOAD DATA INFILE或批量插入可能給一個存儲過程的更好的性能,即使是在一個事務,因爲mysql SP語言並不總是特別有效。