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