【问题标题】:Improve SQL Query performance with JOIN使用 JOIN 提高 SQL 查询性能
【发布时间】:2013-04-15 09:12:22
【问题描述】:

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

但性能也没有提高。我已经对最后一个查询进行了解释,结果如下:

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

【问题讨论】:

  • 慢是什么意思?多长?你有多少行?
  • 连同 scorps Q. 表格 news-events 中有多少列。
  • limit + order by desc 语句可能会降低性能。如果不是强制性的,请不要订购,或通过 ASC 订购。
  • 1 AND 背后的想法是什么?
  • @BrankoDimitrijevic 通常使用它,以便您可以更轻松地注释掉 where 子句的部分内容,而无需重写部分内容。

标签: mysql sql database performance


【解决方案1】:
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

【讨论】:

  • 限制?排序描述?这不是同一个查询
  • 很好的解决方案!这大大提高了查询的性能。谢谢。
【解决方案2】:

试试这个查询 -

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-03
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 2016-09-19
      相关资源
      最近更新 更多