我有以下查询在表中找到双向连接,通过连接保持单向连接:
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
连接数量添加限制。这可能吗?
答案 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
子句中包含两个条件,因为您已经在用户上加入了表。另外,请不要忘记在to
,from
和counter
中使用适当的索引(因为顺序)。
还要小心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