自己加入表 - 性能

时间:2012-01-03 14:08:53

标签: mysql self-join

我想为以下加入提供一些帮助。 我有一个表(大约有2000万行),包括:

MemberId(主键)| Id(主键)| TransactionDate |平衡

我想在一个查询中为所有客户获取最新的余额。 我知道我可以做这样的事情(我只是从记忆中写下来的)。但这种方式非常慢。

SELECT * 
FROM money 
WHERE money.Id = (SELECT MAX(Id) 
                  FROM money AS m 
                  WHERE m.MemberId = money.MemberId)

还有其他(更快/更智能)选项吗?

3 个答案:

答案 0 :(得分:5)

在我经历过的所有优化教程和截屏视频中,连接总是优于子查询。使用子查询时,每次比较都会执行子查询,而连接只执行一次。

SELECT * 
FROM money m
INNER JOIN (
    SELECT memberId, MAX(id) AS maxid
    FROM money
    GROUP BY memberId
) mmax ON mmax.maxid = m.id AND mmax.memberId = m.memberId

答案 1 :(得分:2)

加入并不是解决这个问题的最好方法。考虑使用GROUP BY子句筛选每个成员的最后一个事务,如下所示:

SELECT MemberId,MAX(Id),TransactionDate,Balance FROM money GROUP BY MemberId

<强>更新

PKK指出,平衡将随机选择。看起来你必须执行某种连接。考虑这个选项:

SELECT MemberId, Id, TransactionDate, Balance FROM money WHERE Id IN (
    SELECT MAX(Id) FROM money GROUP BY MemberId
)

答案 2 :(得分:0)

其他选项是在左连接中查找NULL值:

SELECT m1.*
  FROM money m1
  LEFT JOIN money m2 ON m2.memberId = m1.memberId AND m2.id > m1.id
 WHERE m2.memberId IS NULL

但当然Umbrella's answer更好。