所以我有這個superduper查詢找到「相關文章」基於他們有共同的原始文章(在$ id變量中提供)的標籤數量。我不知道實際的查詢是否重要,但這裏是Justin Case。MySQL:程序如何比執行查詢慢?
現在,我從來沒有在實際項目中實際使用過程,但我讀過它們應該更快,部分原因是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 ;
我不確定你在哪裏聽說他們應該更快(你用什麼單位測量450?450駱駝?)。我也不知道賈斯汀凱斯是誰。存儲過程被調用的上下文是什麼?看起來你可能沒有正確使用它們。 – Kermit 2013-03-07 03:15:18
查詢緩存基於整個查詢進行 - 包括您的PHP變量提供的值。所以隨着變量的變化,查詢緩存不能被重用。查詢緩存也是區分大小寫的。 – 2013-03-07 03:15:58
@AarolamaBluenk你不需要乘法因子單位。如果用一個數字乘以一個值,就會得到與原始值相同的單位。賈斯汀凱斯是一個超級英雄,只有在需要時才顯示出來(以防萬一)。上下文只是「CALL get_related_articles(17232)」。此調用運行時間非常接近1秒,而執行實際查詢運行大約2 ms。 – 3Nex 2013-03-07 03:26:31