1

我有以下执行缓慢的 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解释

我很感激任何关于我可以做些什么来提高这个查询的性能的指针。

4

3 回答 3

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
于 2013-04-22T13:00:07.040 回答
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.

于 2013-04-22T13:32:53.083 回答
0

您的查询已经足够好了。朋友发帖查询也不错。但是,如果您有大量数据并且从那时起就没有重建索引,则需要在两个表上重建索引。

这是一个标准协议,数据库管理员需要及时重建所有索引以及重新编译数据库中的所有对象+包。

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

于 2013-04-23T06:53:21.840 回答