使用JOIN提高SQL查询性能

时间:2013-04-22 12:52:38

标签: mysql sql database performance

我有以下,性能低下的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 explain

我很欣赏任何可以改进此查询性能的指针。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

尝试此查询 -

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

答案 2 :(得分:0)

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

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

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