我正在使用一个相当大的数据库,其中每一行都有一个特定的类。每个类又属于一个通用类,它在一个单独的表中指定。因此,为了找到项的广义类,必须执行JOIN。
此外,其中一列包含某个数字值,例如'w'。我正在尝试找到一个有效的查询,它提供特定范围内“w”的项目数,按通用类分组。因此,例如,结果行之一将给出该类中具有w<的项目数的细分。 500,500< 500 w< 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 :(得分:1)
您的查询执行这么长时间的原因可能是它没有正确使用索引(或根本不使用它们!)。 使用EXPLAIN查看MySQL如何执行查询 http://dev.mysql.com/doc/refman/5.5/en/explain.html
另一个原因可能是MySQL首先计算视图的整个结果,然后用它来计算整个查询的结果。
在这种情况下,解决方案是将视图定义与您的查询合并。