DrupalデータベースinnodbまたはMyISAM?


10

Drupalサイトを持っていますが、パフォーマンスの問題が発生しています。データベースをMyISAMからInnoDBに変換するにはどうすればよいですか。切り替えることでパフォーマンスが向上する可能性があることを示します。

MySQLデータベースがInnoDBかMyISAMかを確認するにはどうすればよいですか?


1
テーブルタイプはカタログに関連付けられていません。MyISAMテーブルとInnoDBテーブルが混在するカタログを作成できます。
mpdonadio

2
そのレベルでの最適化にはメリットがありますが、テーブルの種類を変更することでパフォーマンスの問題が解決するかどうかは非常に疑問です。違いはそれほど大きくありません。
Letharion 2012年

1
@Chris J. Lee、それは正しいです。パフォーマンス上の理由から、または特定のテーブルタイプでのみ利用可能な機能を活用するために、テーブルタイプを混在させることができます(たとえば、MyISAMテーブルを使用したFULLTEXT検索)。mysqldのデフォルトを変更し、カタログにさらにテーブルを作成した場合も、偶発的に発生する可能性があります:)
mpdonadio

2
リーサリオン:それはまったく間違っています。テーブルのタイプとmysqlの設定方法はパフォーマンスに大きな影響を与えます!
Walter Heck 2012年

2
@Letharion:実際、アーキテクチャの改善はさておき、SELECTとUPDATEが混在する同時実行などの場合、パフォーマンスが大幅に向上します。UPDATEはMyISAMのテーブルをロックしますが、InnoDBの行のみをロックします。つまり、大幅なパフォーマンスの向上が可能です。テーブルのエンジンを変更するだけで見られます。ここで、ばかげたクエリを実行している場合は、ばかげたクエリを実行しており、テーブルの種類を変更しても役に立ちません。しかし、変化するエンジンを手放せずに却下することも同様に正しくありません。
BMDan 2013年

回答:


8

カスタムクエリを実行できます。

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'

データベース内のすべてのテーブルと、それぞれに使用されているエンジンを一覧表示します。

または、phpMyAdminを使用してデータベースにログインし、データベースを選択することもできますType。テーブルのリストの列にエンジンが表示されます。

個人的にはNavicat for MySQLをお勧めします。これは非常に優れたMySQL GUIであり、このようなことを非常に簡単に見つけることができます。

ソース:http : //www.electrictoolbox.com/mysql-table-storage-engine/


古いMySQL管理者ツールもこのようなものに適しています。MySQL Webサイトをざっと見回しても、インストーラーを見つけることができます。
mpdonadio

@MPDうわーそれはまだ起こっていますか?少し懐かしさを感じてもダウンロードする必要があります:)
Clive

AdministratorとQuery Browserは正式に非推奨になり、現在サポートされていませんが、引き続きダウンロードできます。私はWorkbenchが嫌いで、まだこれらを使用しています。
mpdonadio

コマンドラインでphpMyAdminに表示されたものと同様の出力を表示するには、を使用しますSHOW TABLE STATUS。各エンジンタイプに含まれるテーブルの数の単純なカウントを取得するには、SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINEです。
BMDan 2013年

6

私の最高の経験は、テーブルごとに決定することでした。InnoDBは、テーブルのロックを回避できるため(1つのプロセスが書き込みを行っている間、他のプロセスがテーブルから読み取ることができないため)便利ですが、ページャークエリで頻繁に使用されるCOUNT()でひどく実行されます。

(編集:以下のClivesコメントを参照してください)

使用しているDBに応じて、MySQLの設定にも影響があります。サーバーにアクセスできる場合、設定を確認するには、mysqltunerが最初のステップです。

https://github.com/rackerhacker/MySQLTuner-perl#readme


2
+1 MySQLの以前のHigh Performance Groupマネージャーによるこの記事COUNTによると、InnoDBがクエリに対して遅いことは知りませんでしたが、実際に影響するのは、句を含まないクエリのみです。COUNT(*) WHERE
クライヴ

3
その理由は、MyISAMがテーブル内の行数のテーブルごとの値を保持しているためです。つまり、simple SELECT COUNT(*) FROM tableはその値で即座に返すことができます。InnoDBはそうしないので、主キーインデックス全体をスキャンする必要があります。とは言っても、Drupalは多くのSELECT COUNT(*)ことを行いますが、WHERE句なしでそれを行うコード全体の1か所しか考えられません。したがって、この特定のエッジケースの懸念からMyISAMを使用しないでください。まともなサイズのバッファプールを備えたInnoDBは、すべての実際のクエリに対して高速になります。
BMDan 2013年

6

Webサイトをより速く取得するために物事を試すことは、やみくもに車を変更するようなものであり、次回はもっと速くなることを願っています。

まず、ぶら下がっている果物を試してください。それでも効果がない場合は、実際のボトルネックを見つけてください。

  1. 組み込みのメカニズムを有効にしましたか:ページキャッシュ(匿名ユーザーに対してのみ有効)、CSS、およびJS集約?
  2. ホストがAPCのようなopcodeキャッシュを提供している場合は、それをオンにします。
  3. フルDBを含む、Drupalの地域を設定します。
  4. XDebugが実行されていることを確認してください。
  5. 実際のパフォーマンスプロファイリングを開始します。これにより、Webサイトのどの部分が多くの時間を消費しているかを特定できます。ウェブサイトが遅いほど、有罪のコード/コンポーネントを見つけやすくなります。

多くの場合、それはインデックスを必要とする遅いDBクエリ、または遅い方法で物事を行うモジュールです。

また、ホスティング業者間の大きな違いも発見しました。箱から出して新しいdrupalをインストールする場合、パフォーマンスは大丈夫ですか?そうでない場合は、他のホスティング業者を探す時間です。


5

FWIWで約20KノードのDrupal 6.xサイトでパフォーマンスの問題が発生していたため、すべてのテーブルをInnoDBに移動することにしました。それは簡単で、私が処理した方法は、mysqldumpを使用してすべてのコンテンツをSQLファイルにダンプし、エディター(sed)を使用してMyISAMのすべての出現箇所をInnoDBに置き換え、そのファイルからデータベースを再ロードすることでした。欠点の1つは、InnoDBデータベース(IIRC)からスペースを回復できないことですが、重複するテーブルを別のDBに保持している限り、問題は発生しません。ああ、それでパフォーマンスが大幅に向上しました。また、4つのDrupalインスタンスがあるため、非常に多くのテーブルファイルがファイルシステムから削除されました(そうです、それらはInnoDBファイル自体に含まれています)。これは$ .02相当です。


2
単一のInnoDBテーブルスペースを使用すると、inodeを節約できますが、(ご存知のように)ディスクスペースが犠牲になります。大量のデータを削除しても、そのディスク領域を再利用することはできません。これにより、不要な大きなバックアップファイルが作成され、単一のテーブルを復元できなくなります。そのため、このinnodb_file_per_tableオプションを使用することを好みます。
geewiz

1
また、テーブルをインプレースで変換できますfor tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done。必要に応じ-uroot -psomepassて、2つmysqlのに適切なオプション(など)を追加します。
BMDan 2013年

5

頭を上げただけです。Drupal 6を使用している場合は、DBTunerモジュールをインストールできます。MyISAMからInnoDBにテーブルを簡単に移動できます。はい、そのためのモジュールがあります!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.