0

所以我有这个超级查询,它根据它们与原始文章共有的标签数量(在 $id 变量中提供)来查找“相关文章”。我不知道实际查询是否重要,但这里是 Justin Case。

现在,我从未在实际项目中实际使用过过程,但我读过它们应该更快,部分原因是 MySQL 引擎不需要每次都解释代码。但是,当我将相同的代码放入一个过程并调用该过程时,执行时间平均要长约 450 倍。

为什么?是因为它返回多行吗?程序臭吗?是因为我必须在我的程序中使用输入变量吗?450是一堆!

SELECT a.id, a.image, a.title, a.excerpt, a.permalink, COUNT(rel.category_id) AS n
  FROM articles AS a
  JOIN category_relations AS rel ON rel.article_id = a.id
  JOIN categories AS c ON rel.category_id = c.id
 WHERE rel.category_id IN (SELECT category_id 
                             FROM category_relations 
                            WHERE article_id = {$id})
   AND a.id != {$id}
   AND c.type = 1
GROUP BY rel.article_id
ORDER BY n DESC, publish_date DESC
   LIMIT 10

用于创建过程的代码:

DROP PROCEDURE IF EXISTS get_related_articles;
DELIMITER //
CREATE PROCEDURE get_related_articles(IN id INT)
BEGIN
   SELECT   a.id, a.image, a.title, a.excerpt, a.permalink, COUNT(rel.category_id) AS n
   FROM     articles AS a
    JOIN  category_relations AS rel ON rel.article_id = a.id
    JOIN  categories AS c ON rel.category_id = c.id
   WHERE    rel.category_id IN ( SELECT category_id FROM category_relations WHERE article_id = id)
    AND   a.id != id
    AND   c.type = 1
   GROUP BY rel.article_id
   ORDER BY n DESC, publish_date DESC
   LIMIT    10;
END //
DELIMITER ;
4

2 回答 2

1

欢迎来到 MySQL 的真实世界!有时很难说为什么一个查询的执行时间比另一个查询长。但在你的情况下,答案可以在这里找到:

MySQL 不使用缓存来处理从存储过程中调用的查询。

于 2013-03-07T09:03:19.067 回答
0

对您的延迟不利,但 IN SUBSELECTS 本身可能代价高昂。您是否考虑过加入您现在的子选择?此外,由于文章表是查询的基础,并且 a.id = rel.article_id,如果通过索引可用,您对“a.id”的分组可能会更好。

SELECT 
      a.id, 
      a.image, 
      a.title, 
      a.excerpt, 
      a.permalink
   FROM 
      articles AS a
         JOIN category_relations AS rel 
            ON a.id = rel.article_id 
            JOIN categories AS c 
               ON rel.category_id = c.id
               AND c.type = 1
            JOIN (SELECT category_id 
                     FROM admin_category_relations 
                     WHERE article_id = {$id} ) RelByArticle
               on rel.category_id = RelByArticle.category_id
   WHERE 
      a.id != {$id}
   GROUP BY 
      a.id
   ORDER BY 
      n DESC, 
      publish_date DESC
   LIMIT 10
于 2013-03-07T03:24:42.603 回答