mysql - 在分组 SQL 查询中按范围有效计算结果数

标签 mysql

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

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

现在,我使用一个预先存在的 View ,该 View 已经将通用类连接到结果集中,因此最终查询中不需要 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

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

-编辑- View 的定义没什么了不起的,就像

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)

我很确定还有一个左外连接正在与另一个表进行连接,但是该表中没有任何行被使用(正如我所说,它是一个预先存在的 View ,所以其中有很多东西不是不是为此查询量身定制的)。连接行“class”仅在辅助表中建立索引。

最佳答案

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

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

关于mysql - 在分组 SQL 查询中按范围有效计算结果数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10897571/

相关文章:

java - 根据用户输入值在 MySql 中创建表

php - 自动在数据库表中创建条目(php/mysql)

java - java.lang.RuntimeException:java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

mysql - 无法在 AWS ECS 任务上运行 mysql 镜像的运行状况检查

mysql - 使用主键的一部分作为外键

php - 相关数据的查询构建器结构

php - 尝试上传图像时出现 undefined index 错误

mysql - laravel 如何只获取一次外键数据?

使用变量的 PHP SQL 更新

php - mySQL:将值插入到具有外键关系的2个表中