2010-01-05 73 views
5

我們正在運行一個社交網站,記錄每個成員的行爲(包括訪問其他成員的網頁);這涉及到很多寫入數據庫。這些操作存儲在MyISAM表中,並且由於開始對CPU徵稅,我首先想到的是MyISAM的表鎖定導致了CPU的壓力。將MyISAM轉換爲InnoDB。有利?後果是什麼?

  • 只有讀取和寫入,沒有對此表的更新。我認爲讀取和寫入之間的平衡大約是50/50,因此InnoDB會是更好的選擇嗎?
  • 如果我想將表更改爲InnoDB,並且我們不使用外鍵約束,事務或全文索引 - 我需要擔心什麼嗎?
+0

http://stackoverflow.com/questions/20148/myisam-versus-innodb – Bozho 2010-01-05 13:01:13

+0

這不是上述的重複,因爲它涉及遷移而不是本身的好處。 – MarkR 2010-01-05 13:33:20

+0

您還可以使用混合表格,使MyISAM保留用於讀取繁重的表格和InnoDB的日誌。不過,我個人今天不會使用MyISAM(真的只有全文searchbait)。 – bobince 2010-01-05 13:56:44

回答

7

儘管在其他線程(MyISAM versus InnoDB)中討論過使用它的任何優點/缺點,但遷移是一個不平凡的過程。

考慮

  • 功能測試其談話如果可能,數據庫中的所有組件 - 差分引擎有不同的語義
  • 運行儘可能多的性能測試,你可以 - 有些東西可以改善,其他人可能會更糟糕。一個衆所周知的例子是大表上的SELECT COUNT(*)。
  • 檢查所有代碼將正常處理死鎖 - 你可以讓他們沒有明確的用途交易
  • 估計有多少空間的使用,您將通過轉換得到的 - 在非生產環境中進行測試。

您將無疑需要在大型軟件平臺上進行更改;這是可以的,但看到你(希望)有很多自動測試覆蓋,改變應該是可以接受的。 PS:如果「某物開始對CPU徵稅」,那麼你應該a)在非生產環境中找出什麼,b)在非生產環境中嘗試各種減少它的選項。當你沒有完全分析問題時,你不應該盲目地開始做重大事情,比如更改數據庫引擎。

所有的性能測試都應該在非生產環境中進行,具有類似生產的數據和生產級硬件。否則,很難正確解釋結果。

+1

非常感謝這個信息。你能否詳細說明「不同的語義」? – stef 2010-01-05 14:12:14

2

我認爲很有可能切換到InnoDB會提高性能,但根據我的經驗,在嘗試之前無法確定。如果我是你,我會在同一臺服務器上建立一個測試環境,轉換成InnoDB並運行基準測試。

4

至於其他潛在的遷移問題:

1)空間 - InnoDB表往往需要更多的磁盤空間,但對於InnoDB的新版本梭子魚的文件格式已經縮小差別。通過轉換表格的最近備份並比較大小,您可以瞭解這一點。使用「顯示錶​​狀態」來比較數據長度。

2)全文搜索 - 僅在MyISAM數據

3)GIS /空間數據類型 - 只在MyISAM數據

性能,因爲其他的答案和參考答案表明,它取決於你的工作量。 MyISAM的全表掃描速度要快得多。 InnoDB對於高度併發訪問往往要快得多。如果您的查詢基於主鍵,InnoDB也可以更快。

另一個性能問題是MyISAM總是可以保持行計數,因爲它只進行表級鎖定。因此,如果您經常嘗試獲取非常大的表的行數,那麼InnoDB可能會慢很多。搜索互聯網,如果你需要解決這個問題,我已經看到了幾個提議。

根據表的大小,您可能還需要更新您的MySQL配置文件。至少,您可能希望將字節從key_buffer轉移到innodb_buffer_pool_size。如果您將數據庫保留爲針對MyISAM進行優化,則不會得到公平的比較結果。閱讀所有innodb_ *配置屬性。

0

根據我的經驗,MyISAM表格僅適用於需要在大文本上進行搜索時具有良好性能的文本索引,但您仍然不需要像Solr或ElasticSearch這樣的完全成熟的搜索引擎。

如果你想切換到InnoDB的,但要保持索引的MyISAM表你的文字,我建議你先在這看看:http://blog.lavoie.sl/2013/05/converting-myisam-to-innodb-keeping-fulltext.html

另外:InnoDB支持使用innobackupex來自Percona的活原子備份。在處理生產服務器時,這是上帝。