WordPressにはMyISAMとInnoDBどちらが良いのか?

こんにちわ。不可思議絵の具です。

WordPressのデータベースにはMySQL(又はMariaDB。以後MySQLで統一)が用いられており、ストレージエンジンにMyISAMとInnoDBを選択できます。

では、この2つの違いって何でしょうか?
どちらのほうがWordPressに向いているのでしょうか?

様々なサイトを参照して、私なりに結論を出しました。

スポンサーリンク
スポンサーリンク

ストレージエンジンとは?

ストレージエンジンとはデータを実際に読み書きする処理を担当する部分で、MyISAMInnoDBが特に良く利用されます。

MySQL 5.5以前はMyISAMが標準でしたが、5.5以降はInnoDBが標準です。
また、WordPressはインストール時にデータベースに設定された標準のストレージエンジンをそのまま使います。

そのため、昔から作ってあるブログではMyISAMで構成されていることがほとんどです。

MyISAMとInnoDBの機能差

「標準になるくらいだから、InnoDBの方が良いモノなんでしょ?」

おっしゃる通りで、InnoDBはMyISAMに較べて高機能です。

大きな違いを上げてゆきます。

ロックの粒度が細かい

MyISAMはテーブル単位ロック、InnoDBは行単位ロックです。

  • MyISAMの場合、誰かがテーブルを更新している最中は誰も参照できない
  • InnoDBの場合、誰かがテーブルを更新していても、更新対象行以外は参照できる

という動きの違いになります。

WordPressで言うと、

  • MyISAMの場合、記事登録ボタンを押した数秒間、訪問者は白い画面で待たされる
  • InnoDBの場合、記事登録ボタンを押した数秒間、訪問者は待たされずに他の記事を読める

という動きになります。

訪問者が多いサイトではこの差は大きいでしょう。

MVCCがある

InnoDBにはMVCC(マルチ・バージョン・コンカレンシ・コントロール)が付いています。

細かい説明は省きますが、更新により行ロック中の行を参照する状況になっても、更新前のバージョンを参照できるようにすることでロック解除待ちが不要になります。

要するに、InnoDBは元々行ロックで影響範囲が少ない上、その行についてもMVCCのお陰で更新中も参照できるので、待ちが全く発生しないということです。

行ロック同様、訪問者が多いサイトでは大きいでしょう。

クラスタインデックスになっている

InnoDBではクラスタインデックスが使われます。

クラスタインデックスでは、インデックスに主キーとデータがセットで格納されているので、主キーのインデックスが効くと抽出が非常に高速になる特徴があります。
(インデックスがマッチした時にはデータの読み取りも完了しているため)

残念ながらWordPressは主キーがビシっと当たるテーブルレイアウトではないので(セカンダリーインデックス頼み)、用途に凄くマッチしているという訳ではありません

トランザクションがある

MyISAMにはトランザクションがありませんが、InnoDBにはトランザクションがあります。

WordPress本体はMyISAMでも使えるくらいなので、トランザクションのロジックは入っていないでしょうから、直接のメリットではありません。

しかし、WordPress上で動くアプリケーション(掲示板、在庫管理、アンケート…etc.)を作る場合は重要な機能です。

MyISAMよりInnoDBの方が壊れにくい

トランザクション機能の関係で構造が根本から違うからだと思いますが、MyISAMの方がディスク異常やサーバーの異常停止などのトラブルに弱く、壊れやすいそうです。
(具体的な根拠を示せず申し訳ないです。すみません)

InnoDBの方が壊れにくいというのは、私としてはこれが一番の利点だと思っています。

よほど速度にこだわらない限りInnoDBで問題ない

スポンサーリンク

ぶっちゃけ、WordPressの場合

  • 更新処理といえば記事の登録・更新くらいで、
  • 更新の頻度は少なく、
  • ほとんどの場合管理人が1人で作業するのでバッティングしない

こういった利用状況がほとんどでしょうから、InnoDBの行ロックやMVCCはそれほど有効では無いかと思います。

また、InnoDBはメモリ(バッファープール)とCPUを確保できれば性能が向上しますが、共用レンタルサーバーなどのプアな環境では高機能による負荷のほうがメリットを上回るでしょう。

ですから、

  • 日次バックアップ等、トラブル対策を取った上で速度番長と割り切る
  • 共用レンタルサーバーでメモリが確保できない

こういった場合は、MyISAMが良いと思います。

それでも、人気記事カウンターやアクセス解析などの更新が頻繁なテーブルについてはInnoDBにしておいた方が良いと思います。

ただ、MySQLのバージョンアップとともにMyISAMとInnoDBの性能差は埋まってきており、InnoDBでもメモリを十分に確保できれば参照系ではほぼ同等のようです。

データの安全を考えると多少の処理速度低下は目をつぶってInnoDBを使ったほうが良い、というのが私なりの見解です。

特にクラウドやVPSなど、メモリを十分に使える環境ではInnoDB一択だと思います。

ストレージエンジンの変更方法

簡単に紹介します。

ALTER TABLE

作成済みのテーブルの場合はALTER TABLE文を実行します。

WordPressの場合、こうです。

CREATE TABLE

これから作成するテーブルの場合はCREATE TABLE文にオプションを付加します。
(MySQL 5.5以降は指定しなくてもInnoDBで作られます)

まとめ

スポンサーリンク
  • MySQLのストレージエンジンにはMyISAMとInnoDBがある
  • MyISAMの動作は軽いが、更新機能が弱く、データベースが壊れやすい
  • InnoDBの動作はMyISAMに比べると少し重いが、MySQLの改善でその差は縮まってきている
  • InnoDBには行ロックやMVCCなど、並列性を高める機能がある。
    また、データベースの対障害性も高い

よって、WordPressにおいてはどちらを選ぶかというと・・・

  • 共用サーバーなどプアな環境では今まで通りMyISAMで良いだろう
  • VPSなどリッチな環境ではInnoDBにしない理由はない

という結論になりました。

では(^O^)/

参考資料