繁体   English   中英

使用JOIN提高SQL查询性能

[英]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

但性能也没有改善。 我在最后一个查询上运行了解释,结果如下:

mysql解释

我很欣赏任何指针,我可以做些什么来提高这个查询的性能。

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_idnews_events.idlikes.user_idlikes.content_id

你的查询非常好。 配偶发布的查询也没问题。 但是,如果您拥有大量数据并且从那时起您没有重建索引,则需要在两个表上重建索引。

这是一个标准协议,db admin需要及时重建所有索引,并重新编译db中的所有对象+包。

我希望它会有所帮助:)继续查询!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM