簡體   English   中英

MySQL JOIN +子查詢查詢優化

[英]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我得到以下信息:

DESCRIBE語法的結果

這是我的posts索引:

帖子索引

我的remixes索引:

混音索引

這是我的問題:

  1. 你能解釋一下什么額外的列中使用的術語是真的想告訴我?
  2. 您能否提供有關如何優化此查詢的提示,以便更好地進行擴展。

提前致謝!

更新資料

根據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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM