2013-04-25 6 views
5

私と私たちのチームは、MySQLクエリに奇妙な問題を経験しています。我々はCOUNTSELECTステートメントを使用しています。何らかの理由で、私たちが使用するクライアント(SQLyog)ではかなり高速ですが、PHPを使用するとかなり遅くなります。PHPでは遅いがクライアントでは速くなる

古いmysql_query()とmysqli拡張を使用しようとしましたが、私たちもPDOを使用しようとしましたが、違いはありませんでした。

Stackoverflowの他の記事では、DNSの問題である可能性があり、my.iniの 'skip_name_resolve'を使用して修正できることがわかりましたが、私たちの設定では既にこれを持っていました。

時限結果:

クライアント:2.092秒 PHP:9.1071秒

これは、我々が使用するクエリです。注*

SELECT SQL_NO_CACHE 
    COUNT(m.mm_id) AS total 
FROM 
    db.media_multimedia m 
WHERE m.cat_id IN 
    (SELECT 
    mc.cat_id 
    FROM 
    db.media_multimedia_category mc 
    WHERE mc.cat_active = 1) 
    AND m.mm_published = 1 
    AND (
    m.mm_title LIKE "%denniy%" 
    OR m.mm_text LIKE "%denniy%" 
    OR m.mm_id IN 
    (SELECT 
     a.mm_id 
    FROM 
     db.`media_tag_multimedia` a 
     LEFT JOIN media.`media_tag` b 
     ON a.`tag_id` = b.tag_id 
    WHERE b.tag_name LIKE "%denniy%") 
) 
    AND m.mm_publishing_date >= "2012-04-24 00:00:00" 
    AND m.mm_publishing_date <= "2013-04-24 23:59:59" ; 

:このテストケースのために、私たちは追加SQL_NO_CACHEをクエリに追加して、常に新しい結果セットを取得するようにします。*

我々は、次のPHPとMySQLのバージョンを使用している:

のMySQL:5.1.61 PHP:5.3.3

任意の提案は、この問題を解決するには?

+0

あなたのPHPコードを表示してください。 –

+0

あなたのクエリをテキストファイルに保存して、PHPスクリプトと同じマシン上で次のコードを実行できますか? 'time mysql --user = user --password = pass file_get_contents( "query.sql"))); php -r 'new PDO( "mysql:host = ...; dbname = ..."、 "user"、 "pass" '' 時間差があるかどうか確認してください。 – core1024

+0

PHPをホストしているのと同じマシンからSQLyogを実行していることを確認できますか? 2つの異なるホストからmySqlサーバーに接続している場合、その違いを説明することができます。 PHPコードを表示しますか? – Sepster

答えて

2

私は推測していた場合、私は1つまたは複数の以下のもののいくつかを言うと思いますが、私は、パフォーマンスの違いを説明することはできませんが、プレイしている:のため

  • サーバーが異なり、クエリを最適化しています別のクライアント接続、
  • 私が言ったように、あなたのSQLyogのとPHPクライアントの異なる場所が要因

かもしれません、ただ推測します。

ただし、私は次のようにクエリを整理しようとしました。私はこれがより良く(そして一貫して)機能するかどうか疑問に思いますか?

SELECT SQL_NO_CACHE 
    COUNT(m.mm_id) AS total 

FROM 
    db.media_multimedia m 

    INNER JOIN db.media_multimedia_category mc 
    ON m.cat_id = mc.cat_id 
    AND mc.cat_active = 1 

    LEFT JOIN db.media_tag_multimedia a 
    ON m.mm_id = a.mm_id 

    INNER JOIN media.media_tag b 
    ON a.tag_id = b.tag_id 

WHERE 
    m.mm_published = 1 
    AND 
    (
    m.mm_title LIKE "%denniy%" 
    OR 
    m.mm_text LIKE "%denniy%" 
    OR 
    b.tag_name LIKE "%denniy%" 
) 
    AND m.mm_publishing_date >= "2012-04-24 00:00:00" 
    AND m.mm_publishing_date <= "2013-04-24 23:59:59" ; 
+0

コメントありがとうございます!クエリは高速になりましたが、元のクエリとは異なる/間違った結果を返します。 –

+0

私はそれがINNER JOIN db.media_tag_multimediaであり、LEFTがmedia.media_tagに参加する必要があると思います。 –

+0

@JesperVeldhuizen残念です。クエリが修正されました(私は願っています!)これがOKであれば教えてください。 – Sepster

関連する問題