我有以下,性能低下的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
但性能也没有改善。我已经对最后一个查询进行了解释,这就是结果:
我很欣赏任何可以改进此查询性能的指针。
答案 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_id
,news_events.id
,likes.user_id
,likes.content_id
。
答案 2 :(得分:0)
你的查询非常好。配偶发布的查询也没问题。但是,如果您拥有大量数据并且从那时起您没有重建索引,则需要在两个表上重建索引。
这是一个标准协议,db admin需要及时重建所有索引,并重新编译db中的所有对象+包。
我希望它会有所帮助:) 继续查询!