[英]optimise a mysql query to reduce rows searched
我目前正在抓取我網站上發布的最后 5 條評論,我認為我似乎做得很糟糕。
這是 SQL 查詢:
SELECT c.comment_id
, c.article_id
, c.time_posted
, a.title
, a.slug
, u.username
FROM articles_comments c
JOIN articles a
ON c.article_id = a.article_id
JOIN users u
ON u.user_id = c.author_id
WHERE a.active = 1
AND c.approved = 1
ORDER
BY c.comment_id DESC
LIMIT 5
我的問題是,必須搜索很多行,這似乎很浪費。 我很好奇是否有更好的方法來做到這一點。
如您所見,它給出的行數是 81,486,這看起來有點搞笑。 我在這里想念什么?
確保你有正確的索引
table articles_comments (approved, article_id, author_id )
table articles (active, article_id)
table users (user_id )
結果,只是強制articles_comments 使用PRIMARY 鍵(comment_id)作為索引修復它。
問題是我的排序選擇了所有已批准的評論,因此它使用已批准的列進行排序,導致它從數以萬計的數據中挑選數據。
c: INDEX(approved, comment_id) -- in this order
a: I assume you have PRIMARY KEY(article_id)
u: I assume you have PRIMARY KEY(user_id)
希望c
索引將處理一些WHERE
以及ORDER BY
和LIMIT
。 最壞的情況是它必須掃描整個表而不找到 5 行。
81,486 是假的。 這是獲取良好信息的精確方法:
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';
“讀取”將指示有多少行數據和索引被觸及; 寫入指示正在使用臨時表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.