【问题标题】:how to speed up group by count query for any subset of columns?如何加快按计数查询任何列子集的分组?
【发布时间】:2017-04-08 23:37:36
【问题描述】:

我正在申请人口普查数据处理,它有大约 10 个标准作为收集每个人的信息(地区、年龄、性别、maritalStatus、宗教等),我决定使用 Mysql,我创建每个条件的表和表“人”的列作为这些条件表主键上的外键。

我需要对“人”表上这些标准列的任何子集进行 GROUP BY 并获得每个组合的总计数。

我有大约 300 万条记录,InnoDB 中默认对 person 表的外键列进行索引,一些测试所需的时间大约是 10 秒到 1 分钟。

由于允许随机的列分组,不可能使用复合索引,所以我的问题是在这种情况下如何区分加速性能?

示例: 模式:人(c1,c2,c3,c4,...) 我需要做如下查询:

SELECT c2,c4, count(*) FROM person GROUP BY c2, c4;

c2, c4 - 我的意思是所有列的随机子集,不是必须从 c1, c2, ... 开始,这很容易通过简单的复合索引来解决加速性能问题,但它可以是任何随机子集,所以我不知道用什么来加速。

【问题讨论】:

  • 编辑您的问题并提供您希望加快速度的示例查询。否则,问题就太宽泛了:“我有一些数据和一些假设的查询。如何让它们更快?”
  • 您的查询将需要全表扫描。我没有看到任何简单的加速它们的选项——将临时表放在内存中,获得更好的硬件,使用支持并行处理的不同数据库。
  • i created tables for every criteria 为什么不使用一个包含所有标准的表并添加适当的关系呢?每个人一个真的是一个糟糕的设计
  • 首先它们之间的区别在于一些额外的东西,其次它们只有 10 个
  • 由于每个条件的值范围很小,位图索引可以成为解决方案吗?

标签: mysql sql performance group-by rdbms


【解决方案1】:

它需要全面扫描。时期。没有索引,没有外键等会有所帮助。

不过……

如果表大于缓存,您将受到 I/O 限制。在这种的情况下,寻找缩小表或增加 RAM 的方法将是有益的。

MySQL 没有“位图索引”。无论如何,他们可能不会有太大帮助。

10 条标准导致 1023 种组合。对每个人都做某事是不切实际的。

您提到外键...不要在查询中对其他表使用JOIN,而是在COUNTGROUP BY 之后执行JOIN。 (这会进行几次查找而不是数百万次。)

【讨论】:

    猜你喜欢
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2023-04-04
    • 2015-12-19
    • 2020-11-24
    • 1970-01-01
    相关资源
    最近更新 更多