0

我无法为我的非常大的 MySQL 表计算每列的失败百分比。以下是小桌子的外观示例:

假设 TABLE1 有 5 列和 100 行,
CREATE TABLE IF NOT EXIST TABLE1 (id VARCHAR(255) NOT NULL, col1 DOUBLE NOT NULL, col2 DOUBLE NOT NULL, col3 NOT DOUBLE NULL, col4 NOT DOUBLE NULL);

从“col1”到“col4”的每一列都有自己的上限和下限,我需要找到“col1”到“col4”的失败百分比。这是我现在如何运行计算的示例。

计算总行数并按列“id”分组
SELECT id, COUNT(*) FROM TABLE1 GROUP BY id;

计算 col1,col2,col3,col4 满足所有限制并按列“id”分组的总行数
SELECT id, COUNT(*) FROM TABLE1 WHERE (col1 BETWEEN 0 AND 10) AND (col2 BETWEEN 10 AND 20) AND (col3 BETWEEN 20 AND 30) AND (col3 BETWEEN 30 AND 40) GROUP BY id;

计算不满足 col1 限制的总行数
SELECT id, COUNT(col1) FROM TABLE1 WHERE (col1 NOT BETWEEN 0 AND 10) GROUP BY id;

计算满足 col1 限制但不满足 col2 限制的总行数,按“id”分组
SELECT id, COUNT(col2) FROM TABLE1 WHERE (col1 BETWEEN 0 AND 10) AND (col2 NOT BETWEEN 10 AND 20) GROUP BY id;

计算满足 col1,col2 限制但不满足 col3 限制的总行数,按“id”分组
SELECT id, COUNT(col3) FROM TABLE1 WHERE (col1 BETWEEN 0 AND 10) AND (col2 BETWEEN 10 AND 20) AND (col3 NOT BETWEEN 20 AND 30) GROUP BY id;

计算满足 col1,col2,col3 限制但不满足 col4 限制的总行数,按“id”分组
SELECT id, COUNT(col4) FROM TABLE1 WHERE (col1 BETWEEN 0 AND 10) AND (col2 BETWEEN 10 AND 20) AND (col3 BETWEEN 20 AND 30) AND (col3 NOT BETWEEN 30 AND 40) GROUP BY id;

我编写了一个 R 脚本来执行上述 5 个查询并将结果组合在一个数据帧下。以下是 R 处理后的输出示例:
id,total_no_rows,yield,col1,col2,col3,col4
CATEGORY1,25,80%,2%,8%,4%,6%,0%
CATEGORY2,25,70%,6%,14%,2%,6%,2%
CATEGORY3,25,90%,5%,0%,5%,0%,0%
CATEGORY4,25,65%,20%,2.5%,2.5%,5%,5%

现在使用这种方法,我可以很快得到小桌子的结果。但是,如果表变得非常大,比如 1000 列和 100 万行,则完成计算的时间约为 2 小时,这非常长。

无论如何我可以加快计算速度吗?

  1. 我尝试过索引,但显然 MySQL 无法索引 1000 列。
  2. 尝试同时查询(一次 10 个查询),但没有太大改善。(顺便说一下,我正在使用 InnoDB)
  3. 我已经阅读了一些帖子,其中用户建议将表拆分为更小的块以加快查询执行速度。但是,我的原始数据管理不善(长篇大论),所有数据都转储到一个大文本文件中。因此,将原始数据分成更小的块将是一个挑战。

如果您有任何替代方法来解决此类问题,请告诉我。

编辑:
看起来 Mani 的提议确实节省了很多时间来获得结果。但是,对于非常大的表(数千列和数百万行),完成查询的时间仍然需要大约 10 分钟。有什么办法可以进一步提高查询时间?

4

1 回答 1

0

您可以使用案例并在单个选择命中中找到所有可能的场景。它会减少你的时间。

例子

select id, count(*), 
sum(case when col1 between 0 and 10 then 1 else 0 end) col1_yes,
sum(case when (col1 not between 0 and 10) and (col2 between 0 and 10) then 1 
else 0 end) col1no_col2yes 
from table 
group by id;
于 2013-09-03T12:21:42.517 回答