[英]Improve SQL Query performance with JOIN
我有以下,性能低下的SQL查询:
SELECT *
FROM news_events
WHERE 1 AND (user_id = 2416) OR id IN(SELECT content_id FROM likes WHERE user_id = 2416)
ORDER BY id DESC
LIMIT 0,10
news_events表在user_id上有索引。 而likes表在user_id上有一个索引。
为了提高性能,我使用INNER JOIN以下列方式重写了查询:
SELECT a.*
FROM news_events a
INNER JOIN likes b ON (a.id = b.content_id)
WHERE (a.user_id = 2416) OR (b.user_id = 2416)
ORDER BY a.id DESC
LIMIT 0,10
但性能也没有改善。 我在最后一个查询上运行了解释,结果如下:
我很欣赏任何指针,我可以做些什么来提高这个查询的性能。
SELECT *
FROM
(
SELECT a.*
FROM news_events a
WHERE a.user_id = 2416
UNION
SELECT ne.*
FROM news_events ne
INNER JOIN likes l
ON ne.id=l.contentid
WHERE l.user_id = 2416
)
ORDER BY 1 DESC
LIMIT 0,10
试试这个查询 -
SELECT * FROM news_events ne
LEFT JOIN (SELECT content_id FROM likes WHERE user_id = 2416) l
ON ne.user_id = 2416 OR ne.id = l.content_id
ORDER BY
ne.id DESC
LIMIT
0, 10
应该为这些列编制索引: news_events.user_id
, news_events.id
, likes.user_id
, likes.content_id
。
你的查询非常好。 配偶发布的查询也没问题。 但是,如果您拥有大量数据并且从那时起您没有重建索引,则需要在两个表上重建索引。
这是一个标准协议,db admin需要及时重建所有索引,并重新编译db中的所有对象+包。
我希望它会有所帮助:)继续查询!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.