我正在使用一个相当大的数据库,其中的每一行都有一个特定的类。每个类又属于一个泛化类,它在一个单独的表中指定。因此,为了找到项目的广义类,必须执行连接。
另外,其中一列包含某个数值,比如'w‘。我正在尝试找到一个有效的查询,它给出了一个特定范围'w‘内的项数,并按泛化类分组。因此,例如,其中一个结果行将给出该类中w< 500,500 1500的项数的细分。
现在,我使用了一个预先存在的视图,它已经将泛化类联接到结果集中,因此在最后的查询中不需要联接。最后一个查询使用了我发现的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然而,我不太确定这是否是最有效的方法。由于数据库相当大,整个过程需要五分钟以上的时间才能完成。我认为计算这类东西通常是一个昂贵的操作,但我只是在想,我是否可以使用一种不同的方法来消除一些负载。有没有人?
-编辑-视图的定义不是什么壮观的东西,它类似于
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‘仅在辅助表中被索引。
发布于 2012-06-05 21:48:28
查询执行时间如此之长的原因可能是它没有正确使用索引(或者根本不使用它们!)。使用EXPLAIN查看MySQL如何执行查询。
http://dev.mysql.com/doc/refman/5.5/en/explain.html
另一个原因可能是MySQL首先计算视图的整个结果,然后使用该结果计算整个查询的结果。
在这种情况下,一种解决方案是将视图定义与查询合并。
https://stackoverflow.com/questions/10897571
复制相似问题