Drupalサイトを持っていますが、パフォーマンスの問題が発生しています。データベースをMyISAMからInnoDBに変換するにはどうすればよいですか。切り替えることでパフォーマンスが向上する可能性があることを示します。
MySQLデータベースがInnoDBかMyISAMかを確認するにはどうすればよいですか?
Drupalサイトを持っていますが、パフォーマンスの問題が発生しています。データベースをMyISAMからInnoDBに変換するにはどうすればよいですか。切り替えることでパフォーマンスが向上する可能性があることを示します。
MySQLデータベースがInnoDBかMyISAMかを確認するにはどうすればよいですか?
回答:
カスタムクエリを実行できます。
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/
SHOW TABLE STATUS
。各エンジンタイプに含まれるテーブルの数の単純なカウントを取得するには、SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINE
です。
私の最高の経験は、テーブルごとに決定することでした。InnoDBは、テーブルのロックを回避できるため(1つのプロセスが書き込みを行っている間、他のプロセスがテーブルから読み取ることができないため)便利ですが、ページャークエリで頻繁に使用されるCOUNT()でひどく実行されます。
(編集:以下のClivesコメントを参照してください)
使用しているDBに応じて、MySQLの設定にも影響があります。サーバーにアクセスできる場合、設定を確認するには、mysqltunerが最初のステップです。
COUNT
によると、InnoDBがクエリに対して遅いことは知りませんでしたが、実際に影響するのは、句を含まないクエリのみです。COUNT(*)
WHERE
SELECT COUNT(*) FROM table
はその値で即座に返すことができます。InnoDBはそうしないので、主キーインデックス全体をスキャンする必要があります。とは言っても、Drupalは多くのSELECT COUNT(*)
ことを行いますが、WHERE
句なしでそれを行うコード全体の1か所しか考えられません。したがって、この特定のエッジケースの懸念からMyISAMを使用しないでください。まともなサイズのバッファプールを備えたInnoDBは、すべての実際のクエリに対して高速になります。
Webサイトをより速く取得するために物事を試すことは、やみくもに車を変更するようなものであり、次回はもっと速くなることを願っています。
まず、ぶら下がっている果物を試してください。それでも効果がない場合は、実際のボトルネックを見つけてください。
多くの場合、それはインデックスを必要とする遅いDBクエリ、または遅い方法で物事を行うモジュールです。
また、ホスティング業者間の大きな違いも発見しました。箱から出して新しいdrupalをインストールする場合、パフォーマンスは大丈夫ですか?そうでない場合は、他のホスティング業者を探す時間です。
FWIWで約20KノードのDrupal 6.xサイトでパフォーマンスの問題が発生していたため、すべてのテーブルをInnoDBに移動することにしました。それは簡単で、私が処理した方法は、mysqldumpを使用してすべてのコンテンツをSQLファイルにダンプし、エディター(sed)を使用してMyISAMのすべての出現箇所をInnoDBに置き換え、そのファイルからデータベースを再ロードすることでした。欠点の1つは、InnoDBデータベース(IIRC)からスペースを回復できないことですが、重複するテーブルを別のDBに保持している限り、問題は発生しません。ああ、それでパフォーマンスが大幅に向上しました。また、4つのDrupalインスタンスがあるため、非常に多くのテーブルファイルがファイルシステムから削除されました(そうです、それらはInnoDBファイル自体に含まれています)。これは$ .02相当です。
innodb_file_per_table
オプションを使用することを好みます。
for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done
。必要に応じ-uroot -psomepass
て、2つmysql
のに適切なオプション(など)を追加します。
頭を上げただけです。Drupal 6を使用している場合は、DBTunerモジュールをインストールできます。MyISAMからInnoDBにテーブルを簡単に移動できます。はい、そのためのモジュールがあります!