为什么我的SQL这么慢?

我的桌子相当小,大约50,000行。我的架构如下: 日常 match_id 用户身份 结果 回合 tournament_id 查询:
SELECT user_id 
  FROM `daily` 
 WHERE user_id IN (SELECT user_id 
                     FROM daily 
                    WHERE round > 25 
                      AND tournament_id = 24 
                      AND (result = 'Won' OR result = 'Lost'))
    
已邀请:
以时尚的方式使用in关键字是一个非常危险的[从性能角度来看]要做的事情。它将导致子查询[(从每天舍入> 25并且tournament_id = 24并且(结果='赢'或结果='失去'))选择user_id,在这种情况下运行50,000次。 你想要将它转换为一个连接的东西
select user_id from daily a join
       (select user_id from daily where round > 25 and tournament_id=24 and (result='Won' or result='Lost')) b on a.user_id = b.user_id
执行类似的操作将导致只有两个查询和一个连接。 正如Cyber​​nate在您的具体示例中指出的那样,您可以简单地使用where子句,但我继续并建议这样做,以防您的查询实际上比您发布的更复杂。     
首先验证并添加索引,如前所述。 如果您从同一个表中查询数据,为什么还要使用in。 将您的查询更改为:
SELECT user_id 
FROM   daily 
WHERE  round > 25 
       AND tournament_id = 24 
       AND ( result = 'Won' 
              OR result = 'Lost' ) 
    
您的查询只需要:
SELECT d.user_id 
  FROM DAILY d
 WHERE d.round > 25 
   AND d.tournament_id = 24 
   AND d.result IN ('Won', 'Lost')
索引应考虑在: DAILY.round DAILY.tournament_id DAILY.result     
这应该在一毫秒内返回。
SELECT user_id FROM daily WITH(NOLOCK) 
where user_id in (select user_id from daily WITH(NOLOCK)  where round > 25 and tournament_id = 24 and (result = 'Won' or result = 'Lost'))
然后确保过滤器列上有索引。
CREATE NONCLUSTERED INDEX IX_1 ON daily (round ASC, tournament_id ASC, result ASC)
    

要回复问题请先登录注册