限制连接以避免长查询运行时

时间:2014-03-08 18:58:46

标签: mysql sql

我有以下查询在表中找到双向连接,通过连接保持单向连接:

    SELECT tbl1.to, LEAST( tbl2.counter, tbl1.counter ) AS minCounter
    FROM connections tbl1
       INNER JOIN connections tbl2 ON tbl2.from = tbl1.to
       WHERE tbl1.from =<user_id>
             AND tbl2.to =<user_id>
       ORDER BY LEAST( tbl2.counter, tbl1.counter ) DESC 
       LIMIT 15

这表现相当不错,但有时当有很多from个连接时,它会变得太慢。我想要做的权衡是使其不太准确,并为他在查询中实际用于连接的from连接数量添加限制。这可能吗?

2 个答案:

答案 0 :(得分:1)

1.5B行连接5秒听起来不错。但是这个查询速度慢的一个原因是它会在没有limit子句的情况下返回很多行。那是因为你也指定了一个排序顺序。订购和添加限制将导致首先排序完整的结果,以确定应该返回哪些 15行。

如果您愿意牺牲准确性以获得更好的效果,请尝试删除order by,或在限制结果后订购。

SELECT * FROM 
   (SELECT tbl1.to, LEAST( tbl2.counter, tbl1.counter ) AS minCounter
    FROM connections tbl1
       INNER JOIN connections tbl2 ON tbl2.from = tbl1.to
       WHERE tbl1.from =<user_id>
             AND tbl2.to =<user_id>
       LIMIT 15)
ORDER BY minCounter DESC 

或者,您可以尝试将记录数首先限制为合理的数字(在此示例中为500),然后再次进行排序和限制。这样,对于具有最多500个结果的用户而言,结果将是100%准确的,对于具有更多结果的用户而言,结果将是不准确的。

SELECT * FROM 
   (SELECT tbl1.to, LEAST( tbl2.counter, tbl1.counter ) AS minCounter
    FROM connections tbl1
       INNER JOIN connections tbl2 ON tbl2.from = tbl1.to
       WHERE tbl1.from =<user_id>
             AND tbl2.to =<user_id>
       LIMIT 500)
ORDER BY minCounter DESC 
LIMIT 15

答案 1 :(得分:0)

您不需要在WHERE子句中包含两个条件,因为您已经在用户上加入了表。另外,请不要忘记在tofromcounter中使用适当的索引(因为顺序)。

还要小心ORDER BY LEAST()。尝试没有它,我相信这将是一个很大的区别。

SELECT tbl1.to, LEAST( tbl2.counter, tbl1.counter ) AS minCounter
FROM connections tbl1
   INNER JOIN connections tbl2 ON tbl2.from = tbl1.to
   WHERE tbl1.from =<user_id>
   ORDER BY tbl2.counter DESC, tbl1.counter DESC 
   LIMIT 15