如何优化两个MySQL表之间的连接?

时间:2011-03-13 14:15:04

标签: mysql

我有两个表: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”但我不知道如何解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:2)

我假设你的索引是组合索引(group_id和event_index在一起)。如果每个字段都有单独的索引,那么一次只使用一个索引,并且数据库引擎将经历更多的数据。

例如,如果你只有一些独特的group_id,但 lot 的event_index,并且你有两个索引,一个只在group_id上,另一个在event_index上,那你就查询了为每个group_id运行大量行。如果你有一个索引,而且两个字段都按顺序排列,那么查询的运行速度会快得多。