【问题标题】:Indexes for random queries across 1.5M lines table跨 150 万行表的随机查询索引
【发布时间】:2013-05-13 15:30:46
【问题描述】:

我有一个相当大的 150 万行的 mysql 表。 有 7 列用标签(varchar)标识数据,38 列包含数字(十进制)数据;

数据是这样组织的

ColA | ColB | ColC | ... | Data1 | Data2 | Data3
A1   |  B1  |  C1  | ... |  123  |  456  | 789  
A1   |  B1  |  C2  | ... |  123  |  456  | 789  
A1   |  B1  |  C3  | ... |  123  |  456  | 789  
A1   |  B2  |  C1  | ... |  123  |  456  | 789  
A1   |  B2  |  C2  | ... |  123  |  456  | 789  
A1   |  B2  |  C3  | ... |  123  |  456  | 789  
A2   |  B1  |  C1  | ... |  123  |  456  | 789  
A2   |  B1  |  C2  | ... |  123  |  456  | 789  
A2   |  B1  |  C3  | ... |  123  |  456  | 789  
A2   |  B2  |  C1  | ... |  123  |  456  | 789  
A2   |  B2  |  C2  | ... |  123  |  456  | 789  
A2   |  B2  |  C3  | ... |  123  |  456  | 789  

现在,我正在运行如下查询:

select ColA, ColB, Sum(DATA1), Sum(DATA2), group by ColA, ColB

但我的查询可以由任何顺序的任何列组成,例如

select ColC, ColA Sum(DATA5), Sum(DATA2), group by ColA, ColC

这是不可预测的,但是,所有查询都将由至少 1 个标签列和一个数据列组成。所有数据列将被求和,标签列被分组。

我无法在所有列上创建单个索引,因为大小会超过最大值。 我可以在所有列之间创建所有可能的索引组合,但我不确定它会更好,它需要数千个索引。

我的想法是在所有数据列和标签列之间创建索引,例如:

key (ColA, ColB, ColC, ..., Data1)
key (ColB, ColA, ColC, ..., Data1)
key (ColB, ColC, ColA, ..., Data1)
...

这会是一个有效的解决方案吗? 还有其他(更好的)想法吗?

【问题讨论】:

  • 索引实际上只影响你 JOINWHERE 子句。如果您从表中选择所有行,那么您拥有什么索引并不重要。您能否提供有关您应用于查询的限制的任何详细信息(通过连接或 where 条件)。
  • 你好德克兰,我不使用任何连接。我的表格主要包含这样组织的统计数据:国家>建筑类型>能源效率> ...目标是向用户提供报告。他们可能希望获得每个国家 A 型建筑的总数,这意味着 mysql 将需要在数十万行上进行汇总。我的目标是找到一种方法来预先计算 SUM 的结果以加速这些查询,我虽然索引会这样做,但也许我看错了。
  • 我同意@eggyal 的观点,即值得考虑不同的数据模型。如果不这样做,我只会在您的 7 个标签列中的每一个上放置一个索引。并不完美,但它可能会为您的大多数查询提供有用的索引。
  • 问题是我的查询是根据用户想要显示的数据生成的,有点像 excel 数据透视表,所以 SELECT 和 Group BY 的所有组合都是可能的,我没有真的看看我如何在这种情况下制作另一个模型。因为我需要以各种可能的方式对数据求和,所以使用聚合表会给我 7 个! = 5040 个表。

标签: mysql indexing group-by sum


【解决方案1】:

好的,我可能已经找到了解决方案。事实证明,列的顺序并没有改变结果,例如:select ColA, ColB, Sum(data1) group by ColA, ColB 会返回相同的数据:select ColB, ColA, Sum(data1) group作者:ColB, ColA 因此有可能制定一种算法,将所有数据合并为:7(7-1)/2 + 6(6-1)/2 + 5(5-1)2 = 56 个表(如果我是正确的)。或者,我可以得到一个更好的服务器并拥有足够大的 innodb 池大小(比如说 2Go)以将所有 mysql 表都放在 ram 中。 ——

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多