我有一个相当大的 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)
...
那会是一个有效的解决方案吗?还有其他(更好的)想法吗?