我有两个表:p_group.full_data,这是我正在处理的大型数据集(100k行,200列)和p_group.full_data_aggregated,我用它来总结一堆其他表。
现在,我想要做的是在full_data和full_data_aggregated之间执行连接以选择某些行,平均值等等。我的查询如下:
SELECT 'name', p.group_id, a.group_condition, p.event_index, AVG(p.value) FROM p_group.full_data p
JOIN p_group.full_data_aggregated as a on p.group_id = a.group_id AND p.event_index = a.event_index
WHERE (a.group_condition='open')
GROUP BY p.group_id, p.event_index
我有一个索引:full_data.group_id,full_data.event_index和full_data_aggregated.group_id,full_data_aggregated.event_index,full_data_aggregated.group_condition。
现在,问题是这个查询根本无法完成:之前,我将full_data拆分为不同的表(每个group_id一个),并且运行正常。但是现在我已经加入了这些组,查询就在那里运行,所以我只能假设我做了一些愚蠢的事情。
还有什么我可以试着让这个查询以合适的速度运行吗?我确定我已经搞砸了索引和按功能分组的东西,但我无法解决问题。我已经尝试过上述查询的各种变体。 EXPLAIN表示它是“使用where;使用临时;使用filesort”但我不知道如何解决这个问题。
谢谢!
答案 0 :(得分:2)
我假设你的索引是组合索引(group_id和event_index在一起)。如果每个字段都有单独的索引,那么一次只使用一个索引,并且数据库引擎将经历更多的数据。
例如,如果你只有一些独特的group_id,但 lot 的event_index,并且你有两个索引,一个只在group_id上,另一个在event_index上,那你就查询了为每个group_id运行大量行。如果你有一个索引,而且两个字段都按顺序排列,那么查询的运行速度会快得多。