使用mysql中的不同表中的列进行算术[optmization]

时间:2015-06-19 01:13:24

标签: mysql

在以下查询中:

SELECT 
  (SELECT nick FROM nicks n WHERE n.pid=p.id LIMIT 1 ORDER BY id DESC) as nick
  , (
          (
             ( SELECT COUNT(*) FROM kills k WHERE k.pid = p.id ) 
             + 
             ( SELECT COUNT(*) FROM votos v WHERE v.pid = p.id )
           ) 
          - (SELECT COUNT(*) FROM deaths d WHERE d.pid = p.id )
  ) as score
  , (SELECT COUNT(*) FROM kills k WHERE k.pid = p.id ) as kills
  , (SELECT COUNT(*) FROM deaths d WHERE d.pid = p.id ) as deaths
  , (SELECT COUNT(*) FROM headshots h WHERE h.pid = p.id ) as headshots
  , (SELECT COUNT(*) FROM votos v WHERE v.pid = p.id ) as reputation
FROM  players p
WHERE p.uuid='STEAM_x:x:xxxxxx'
GROUP BY kills

此查询工作正常......但我认为存在更好的方法来执行此操作。 任何人都可以帮我优化这个查询吗?

enter image description here

1 个答案:

答案 0 :(得分:1)

这是一种更好的编写查询的方法:

SELECT p.*, (kills + reputation - deaths) as score
FROM (SELECT (SELECT nick FROM nicks n WHERE n.pid = p.id ORDER BY id DESC LIMIT 1
             ) as nick,
             (SELECT COUNT(*) FROM kills k WHERE k.pid = p.id ) as kills,
             (SELECT COUNT(*) FROM deaths d WHERE d.pid = p.id ) as deaths,
             (SELECT COUNT(*) FROM headshots h WHERE h.pid = p.id ) as headshots,
             (SELECT COUNT(*) FROM votos v WHERE v.pid = p.id ) as reputation
      FROM players p
      WHERE p.uuid = 'STEAM_x:x:xxxxxx'
     ) p
GROUP BY kills;

注意:我不明白GROUP BY正在做什么。您只是按一列聚合,因此其余列具有不确定值。也许你打算ORDER BY

我猜测在group by之前实现子查询的开销略小于其他子查询。但是你的版本可能具有非常可比的性能。

对于任一版本,您需要以下索引:

  • players(uuid)
  • kills(pid)
  • deaths(pid)
  • headshots(pid)
  • votos(pid)