2012-06-05 60 views
0

我正在处理一个相当大的数据库,其中每一行都有一个特定的类。每个类都属于一个泛化类,它在单独的表中指定。所以,为了找到一个项目的泛化类,必须执行一个JOIN。按分组SQL查询范围有效计算结果数

此外,其中一列包含某个数值,例如'w'。我试图找到一个有效的查询,它给出了'w'的特定范围内的项目数量,并按广义类别进行分组。因此,例如,结果行的人会给出与该类别的项目数的击穿W¯¯< 500,500<瓦特< 1500和W> 1500

现在,我用一个预先存在查看已将广义类加入结果集中,以便在最终查询中不需要JOIN。最后的查询使用我发现的一个技巧here来计算特定范围内的项目数量。

SELECT generalized_class, 
    SUM(IF(w BETWEEN 1 AND 500, 1, 0)) AS low, 
    SUM(IF(w BETWEEN 500 AND 1500, 1, 0)) AS middle, 
    SUM(IF(w > 1500, 1, 0)) AS high 
FROM table_vw 
GROUP BY generalized_class 

但是,我不太确定这是否是最有效的方法。由于数据库相当大,整个过程需要五分钟才能完成。我想,计算这种东西一般来说是一个昂贵的操作,但我只是想知道我是否可以使用不同的方法来消除一些负载。任何人?

CNC中 视图的定义是什么壮观,它像

CREATE VIEW table_vw AS SELECT d.id, d.class, c.generalized_class, <more fields>, 
(w_high/w_low)/2 AS w 
FROM base_table d 
LEFT OUTER JOIN secondary_table c 
    ON (d.class = c.class) 

我敢肯定有一个更左外连接被另一个表进行,但没有从该表中的行(正如我所说的,这是一个预先存在的视图,所以有很多东西不是为这个查询量身定做的)。连接行'class'仅在辅助表中编入索引。

+0

什么是您当前使用的查看查询?你加入的表格的结构和索引是什么,目前的解释计划是什么意思? – Ben

+0

请发布viwe及其基础表的定义。 – Quassnoi

回答

1

您的查询需要很长时间才能执行的原因可能是它没有正确使用索引(或根本不使用它们!)。 使用EXPLAIN查看MySQL如何执行您的查询。
http://dev.mysql.com/doc/refman/5.5/en/explain.html

另一个原因可能是MySQL首先计算视图的整个结果,然后用它来计算整个查询的结果。
在这种情况下,解决方案是将视图定义与您的查询合并。

+0

我已经设法通过从视图中剥离一些不必要的字段来获得一些加速,但仍然需要相当长的时间。据我可以从EXPLAIN输出中看到,索引很难解决问题。还有另一种重组或优化的方式吗? – JorenB