1.5M行表中随机查询的索引

时间:2013-05-13 15:30:47

标签: mysql indexing group-by sum

我有一个非常大的1.5百万行的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个Label列和一个数据列组成。将对所有数据列求和,并将标签列分组。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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