为什么我的SQL这么慢?

时间:2011-03-04 04:34:41

标签: mysql sql

我的桌子相当小,大约有50,000行。我的架构如下:

DAILY

  • match_id
  • USER_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'))

4 个答案:

答案 0 :(得分:3)

以你的方式使用in关键字是一个非常危险的[从性能角度来看]要做的事情。这将导致子查询[(从每天选择user_id,其中round> 25和tournament_id = 24并且(result ='Won'或result ='Lost'))]在这种情况下运行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子句,但我继续提出建议,以防您的查询实际上比您发布的内容更复杂。

答案 1 :(得分:2)

首先按照之前的建议验证并添加索引。

如果您要查询同一个表中的数据,为什么还要使用in? 将您的查询更改为:

SELECT user_id 
FROM   daily 
WHERE  round > 25 
       AND tournament_id = 24 
       AND ( result = 'Won' 
              OR result = 'Lost' ) 

答案 2 :(得分:1)

您的查询只需要:

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

答案 3 :(得分:0)

这应该在一毫秒内返回。

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)