[英]MySQL JOIN + Subquery Query Optimization
我正在嘗試獲取100個帖子,並按上周“混音”的次數對其進行排序。 到目前為止,這是我的查詢:
SELECT COUNT(remixes.post_id) AS count, posts.title
FROM posts
LEFT JOIN (
SELECT * FROM remixes WHERE created_at >= 1343053513
) AS remixes ON posts.id = remixes.post_id
GROUP BY posts.id
ORDER BY count DESC, posts.created_at DESC
LIMIT 100
這會產生正確的結果; 但是,運行DESCRIBE
我得到以下信息:
這是我的posts
索引:
我的remixes
索引:
這是我的問題:
提前致謝!
根據Zane的解決方案,我已將查詢更新為:
SELECT COUNT(remixes.post_id) AS count, posts.title
FROM posts
LEFT JOIN remixes ON posts.id = remixes.post_id AND remixes.created_at >= 1343053513
GROUP BY posts.id
ORDER BY count DESC, posts.created_at DESC
LIMIT 100
這是最新的DESCRIBE
我仍然擔心文件filesort
部分。 有任何想法嗎?
盡量不要將JOIN
包裝在子選擇中,因為這將創建一個未索引的臨時表來存儲子選擇的結果,然后將子選擇的結果連接到該未索引的表中。
相反,在加入混音表時,將created_at
作為附加的加入條件:
SELECT
a.title, COUNT(b.post_id) AS remixcnt
FROM
posts a
LEFT JOIN
remixes b ON a.id = b.post_id AND b.created_at >= 1343053513
GROUP BY
a.id, a.title
ORDER BY
remixcnt DESC, a.created_at DESC
LIMIT 100
在我看來,這
SELECT COUNT(remixes.post_id) AS count, posts.title
FROM posts
LEFT JOIN (
SELECT * FROM remixes WHERE created_at >= 1343053513
) AS remixes ON posts.id = remixes.post_id
GROUP BY posts.id
ORDER BY count DESC, posts.created_at DESC
LIMIT 100
可以改寫成
SELECT COUNT(r.post_id) AS count, posts.title
FROM posts
LEFT JOIN remixes r ON posts.id = r.post_id
WHERE r.created_at >= 1343053513
GROUP BY posts.id
ORDER BY count DESC, posts.created_at DESC
LIMIT 100
這樣可以為您提供更好的EXPLAIN
計划,並且運行速度更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.