0

私はこれらのSQLクエリを持っています(私はcodeigniter dbクラスを使用しています):

        $query = $this->db->select("a.title AS articles_title, 
                    a.content AS articles_content,
                    a.excerpt AS articles_excerpt,
                    a.slug AS articles_slug,
                    a.views AS articles_views,
                    a.views AS articles_views,
                    CONCAT(up.first_name, ' ', up.last_name) AS articles_author,
                    DATE_FORMAT(a.created, '%T %d.%m.%Y') AS articles_created, 
                    (SELECT IF(ROUND(AVG(av.vote),1), ROUND(AVG(av.vote),1), 0)  FROM articles_votes av WHERE a.id = av.article_id) AS articles_votes,
                    (SELECT COUNT(ac.id) FROM articles_comments ac WHERE a.id = ac.article_id) AS articles_totalcomments", FALSE)
            ->from('articles a')
            ->join('user_profiles up', 'a.author_id = up.user_id')
            ->where('page_id', $page_id)
            ->order_by("a.$ordering")
            ->get();

サーバーのリソースと速度に適していますか? または、投票とコメントをカウントする別の関数を作成する必要があります。この関数は、すべてのコメントと平均投票をカウントし、後でそれを記事の配列に追加しますか?

ありがとうございました

4

1 に答える 1

0

使用されるリソースとクエリプランの効率は、基盤となるデータベースと、もちろん、生成される実際のSQLによって異なります。SQLプロファイリングツールを使用して、クエリが実際にどのように実行されるかを確実に理解することは常に良いことです。

そうは言った。次のようにすると、パフォーマンスが向上する場合があります。

SELECT 
   a.student_id, 
   a.name, 
   (select sum(s.score) from scores s where s.student_id = a.student_id) as total_score
FROM students a

このようなものに:

SELECT
   a.student_id,
   a.name,
   tot.score
FROM students a
JOIN (
   SELECT student_id, 
          sum(score)
   FROM scores 
   GROUP BY student_id
) as tot ON tot.student_id = a.student_id

列式にインデックス付けされていない列に対するクエリが含まれている場合、実行するたびに全表スキャンが必要になる場合があります。私の例では、結合結果にキーを含めているので、クエリは1回実行され、外側の選択で取得できます。

お役に立てば幸いです。

于 2012-08-23T07:31:27.440 に答える