我有一个非常大的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)
...
这是一个有效的解决方案吗? 还有其他(更好的)想法吗?
答案 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表。 -