MySQL:优化查询评分计算

时间:2013-04-19 20:15:51

标签: mysql optimization

我有一个数据表,用于进行一些计算。计算后得到的数据集如下所示:

+------------+-----------+------+----------+
| id_process | id_region | type | result   |
+------------+-----------+------+----------+
|          1 |         4 |    1 |  65.2174 |
|          1 |         5 |    1 |  78.7419 |
|          1 |         6 |    1 |  95.2308 |
|          1 |         4 |    1 |  25.0000 |
|          1 |         7 |    1 | 100.0000 |
+------------+-----------+------+----------+

另一方面,我有另一个表,其中包含一组用于对计算结果进行分类的范围。范围表如下所示:

 +----------+--------------+---------+
 | id_level | start |  end |  status |
 +----------+--------------+---------+
 |        1 |   0   |   75 |  Danger |
 |        2 |  76   |   90 |  Alert  |
 |        3 |  91   |  100 |  Good   |
 +----------+--------------+---------+

我需要做一个查询,在进行计算时为每个值添加相应的“status”列。目前,我可以将以下字段添加到计算查询中:

select
   ...,
   ...,
   [math formula] as result,
(select status 
   from ranges r
   where result between r.start and r.end) status
from ...
where ...

一切正常。但是当我有很多行(超过200K)时,计算查询会变慢。

我的问题是:有一些方法可以在不执行子查询的情况下找到“状态”值吗?

有人曾经做过类似的事情吗?

由于

1 个答案:

答案 0 :(得分:2)

是的,您正在寻找子查询并加入:

select s.*, r.status
from (select s.*
      from <your query here>
     ) s left outer join
     ranges r
     on s.result between r.start and r.end

显式join通常比嵌套select更优化。但是,在这种情况下,ranges表似乎很小,所以这可能不是性能问题。