MySQL查询优化.许多SELECT + INNER JOIN

Sir*_*r D 0 mysql select

我有下一个表结构:游戏 - 包含基本游戏信息(体育赛事),投注 - 投注变化(团队胜利,团队b胜等),投票 - 用户选择投注变化.

下一个查询显示所有未开始游戏的所有最后投注变化的列表.如果当前用户对其进行了投票,则列表中的某些投注也会包含一些信息.

用于下次检测插入选择:1 - 是用户已经投给了这个赌?2 - 获取用户的choise(是\否),3 - 获取用户的投票量.

SELECT bets.*, games.Time, games.TA, games.TB, 
  (SELECT COUNT(*) FROM votes WHERE BID=bets.BID AND UID=$UserID) AS Vt, 
  (SELECT YN FROM votes WHERE BID=bets.BID AND UID=$UserID) AS yn,
  (SELECT Pt FROM votes WHERE BID=bets.BID AND UID=$UserID) AS Pt
FROM bets
LEFT JOIN games ON games.GID = bets.GID
WHERE games.Yes=0 AND bets.Dl=0
ORDER BY bets.Time DESC
Run Code Online (Sandbox Code Playgroud)

我该如何优化它?如何在一个查询中获得votes.YN和votes.Pt?

Gor*_*off 7

left join没用,因为你在第二个表中使用了一个值.所以,inner join为了清楚起见,我会将其改为.

另外,子查询for YNPT没有聚合,所以它们似乎可以返回多行.我假设应该有一个sum().

然后,我将三个相关的子查询移动到from子句中.这需要汇总bid:

SELECT bets.*, games.Time, games.TA, games.TB,
       coalesce(v.vt, 0) as vt, coalesce(v.yn, 0) as yn, coalesce(v.pt, 0) as pt
FROM bets inner join
     games
     ON games.GID = bets.GID left join
     (select bid, count(*) as vt, sum(yn) as yn, sum(pt) as pt
      from votes v
      where UID=$UserID
      group by bid
     ) v
     on v.bid = bets.bid
WHERE games.Yes=0 AND bets.Dl=0
ORDER BY bets.Time DESC;
Run Code Online (Sandbox Code Playgroud)

编辑:

我要指出,这可能会也可能不会提供改进的性能(取决于where条款的选择性等因素).随着left outer join用于跟踪所有从行bets,它可能会更好.

添加以下索引应该修复查询的原始版本: votes(bid, uid).