这是对资源的良好SQL查询吗?

时间:2012-08-23 07:06:52

标签: sql

我有这些sql查询(我使用codeigniter db class):

        $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();

对服务器资源和速度有好处吗?或者我应该创建另一个计算投票和评论的功能,这将计算所有评论和平均投票,然后将其添加到文章数组中?

谢谢

1 个答案:

答案 0 :(得分: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

如果列表达式涉及对未编制索引的列的查询,则每次运行时都可能需要进行全表扫描。在我的示例中,我在连接结果中包含一个键,因此查询完成一次,然后您可以在外部选择中获取它。

希望有所帮助。