0

我有一个相当大的 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)
...

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

4

1 回答 1

0

好的,我可能已经找到了解决方案。事实证明,列的顺序并没有改变结果,例如: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 中。——</p>

于 2013-05-13T18:44:46.323 回答