2010-01-22 79 views
8

我有一個數據庫有大約30個表,其中5個表是寫密集型的。MyISAM和InnoDB表在一個數據庫中

我考慮

  1. 轉換5寫入密集型表使用InnoDB引擎,並保持休息的MyISAM引擎

  2. 轉換所有表使用InnoDB引擎。

我想知道哪種方法更好?

更具體

我想保留一些表上MyISAM引擎的原因是他們中的一些有大約1,000,000行。我不確定在轉換爲InnoDB後,這些表上的「SELECT COUNT(*)」這樣的查詢會有多慢。

我還沒有做過測試。在開始切換之前,我更願意從您的任何一位處獲得一些建議。

+0

爲什麼不能擁有兩個最好的世界:MySQL PBXT? – 2010-01-22 02:29:29

回答

12

現在,我總是默認使用InnoDB,尤其是在MyISAM遭受全表鎖定的寫密集表上。這是一個點對點的比較。

理由使用MyISAM:

  • 表是非常快的選擇,重載荷
  • 表級鎖限制了其可擴展性,高寫入多用戶環境。
  • 最小的磁盤空間消耗
  • 全文索引
  • 合併和壓縮表。

原因使用InnoDB:

  • ACID事務
  • 行級鎖
  • 持續讀 - 讓你達到卓越的讀寫併發。
  • 主鍵集羣 - 在某些情況下可提供出色的性能。
  • 外鍵支持。
  • 索引和數據頁面都可以被緩存。
  • 自動崩潰恢復 - 如果MySQL關機不乾淨InnoDB表仍然會 - 恢復到一致狀態 - 不像MyISAM那樣需要檢查/修復。
  • 所有更新必須通過InnoDB中的事務引擎,這通常會降低 - 性能與非事務性存儲引擎相比。

以上是從this site,這不再是似乎工作。

+1

您對於COUNT(\ *)的跟蹤擔憂是有根據的。 InnoDB不會在表中保留行的內部計數,因此執行SELECT COUNT(\ *)不會執行全表掃描。儘管這樣的查詢不需要MyISAM的時間,但對於1mil行,等效的InnoDB查詢可能需要幾秒鐘的時間。典型的解決方案是維護另一個「計數器表」,您可以在其中手動增加和減少,具體取決於您是插入還是移除可計數行。你可以在這裏找到更多:http://dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html「SHOW TABLE STATUS」下。 – BrainCore 2010-01-22 03:58:55

2

各有利弊。

爲(1) 優點:較少的磁盤空間的使用,爲的MyISAM讀取重訪問模式

缺點快得多:存儲器必須在innodb的緩衝器和MyISAM鍵緩衝器之間共享。 innodb表格比他們的myisam表格大4倍。編程代碼必須適用於死鎖處理。

只記得如果您要更改索引列或主鍵,innodb也會鎖定。