0

我正在使用一个相当大的数据库,其中每一行都有一个特定的类。每个类又属于一个广义类,该类在单独的表中指定。因此,为了找到项目的广义类,必须执行 JOIN。

此外,其中一列包含某个数值,例如“w”。我正在尝试找到一个有效的查询,该查询给出特定范围内的“w”范围内的项目数,按广义类分组​​。因此,例如,其中一个结果行将给出该类中 w < 500、500 < w < 1500 和 w > 1500 的项目数的细分。

现在,我使用一个预先存在的视图,该视图已经将泛化类连接到结果集中,因此在最终查询中不需要 JOIN。最后的查询使用我在这里找到的一个技巧来计算特定范围内的项目数量。

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

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

-edit- 视图的定义并没有什么特别的,就像

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)

我很确定还有一个左外连接正在另一个表中,但没有使用该表中的行(正如我所说,这是一个预先存在的视图,所以里面有很多东西不是定制的对于这个查询)。连接行“类”仅在辅助表中编制索引。

4

1 回答 1

1

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

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

于 2012-06-05T13:48:28.080 回答