0

私が取り組んでいるプログラムは、複雑なMySQLクエリを使用して、一致するアイテムIDを持つ複数のテーブルからの情報を結合します。ただし、以下に示すサブクエリを追加したため、クエリの実行にかかる時間は1秒未満から3秒以上になりました。このクエリをより高速に最適化するために私ができることについて何か提案はありますか?複雑なクエリを1つ持つ方が、小さなクエリを4つまたは5つ持つよりも優れていると考えるのは間違っていますか?

    SELECT uninet_articles.*, 
           Unix_timestamp(uninet_articles.gmt), 
           uninet_comments.commentcount, 
           uninet_comments.lastposter, 
           Unix_timestamp(uninet_comments.maxgmt) 
    FROM   uninet_articles 
           RIGHT JOIN (SELECT aid, 
                              (SELECT poster 
                               FROM   uninet_comments AS a 
                               WHERE  b.aid = a.aid 
                               ORDER  BY gmt DESC 
                               LIMIT  1) AS lastposter, 
                              Count(*)   AS commentcount, 
                              Max(gmt)   AS maxgmt 
                       FROM   uninet_comments AS b 
                       GROUP  BY aid 
                       ORDER  BY maxgmt DESC 
                       LIMIT  10) AS uninet_comments 
                   ON uninet_articles.aid = uninet_comments.aid 
    LIMIT  10 
4

2 に答える 2

0

クエリは、データを調べて一致するものを見つけるようなものです。サブクエリでは、必要なアイテムを見つけるためにデータを何度も調べる必要があります。この場合、おそらく複数のクエリとして書き直したいと思うでしょう。多くの場合、複数の単純なクエリの方が適しています。これはそのようなケースの1つだと思います。

また、インデックスが適切に機能しているかどうかを確認することもできます。それが何であるかを知っている場合です。これに関係する理由:データベースのインデックス作成はどのように機能しますか?

具体的な提案については、各AIDの最後のポスターを別のクエリで見つけて、後で結合するだけです。

于 2012-06-27T15:40:53.553 に答える
0

それは常にあなたが持っているデータとあなたがそれを使う方法に依存します。

インデックスを使用しているかどうかを確認するには、選択にexplainを使用する必要があります。 http://dev.mysql.com/doc/refman/5.5/en/explain.html

于 2012-06-27T15:44:40.793 に答える