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

如何优化两个MySQL表之间的连接?,mysql,Mysql,我有两个表:p_group.full_data,这是一个大数据集,我正在处理100k行、200列和p_group.full_data_aggregated,我生成它来总结其他表的负载 现在,我想做的是在full_数据和full_数据_聚合之间执行联接,以选择某些行、平均值等等。我的问题如下: SELECT 'name', p.group_id, a.group_condition, p.event_index, AVG(p.value) FROM p_group.full_data p JOI

我有两个表:p_group.full_data,这是一个大数据集,我正在处理100k行、200列和p_group.full_data_aggregated,我生成它来总结其他表的负载

现在,我想做的是在full_数据和full_数据_聚合之间执行联接,以选择某些行、平均值等等。我的问题如下:

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

现在的问题是,这个查询根本无法完成:以前,我将完整的\u数据拆分为不同的表,每个表对应一个组\u id,这很好。但是现在我已经将这些组连接在一起,查询就在那里运行,因此我只能假设我做了一些愚蠢的事情

我还可以试着让这个查询以合适的速度运行吗?我肯定我把索引和函数分组搞砸了,但我搞不清楚是什么。我尝试了上述查询的各种变体。解释表明它正在使用where;使用临时设备;正在使用文件排序,但我不确定如何修复此问题


谢谢

我假设您的索引是组id和事件索引的组合索引。如果每个字段都有单独的索引,那么一次只使用一个索引,数据库引擎将处理更多的数据


例如,如果您只有几个唯一的组id,但有很多事件索引,并且您有两个索引,一个仅在组id上,另一个在事件索引上,那么您的查询将针对每个组id运行大量的行。如果您有一个索引,两个字段按顺序排列,然后查询将运行得更快。

我只是好奇。。。你是否正在进行某种多维分析,可能是试图破解外汇?你是否检查过数据库的查询计划,看它是否正在进行任何大型表扫描?哈,很遗憾,我正在分析一些实验中的无聊数据。我甚至不知道外汇是什么!完美的我有相当数量的团体指数30左右和数百个事件指数。当然,我没有建立一个组合索引。现在它只需0.6秒。我会记住你的观点,当一切失去控制,我必须重新组织我的指数!谢谢您使用的是什么数据库引擎?数据库引擎应该注意到,基于索引统计信息,您只有很少的唯一组id,并使查询计划改为使用事件索引。不过,它不会像组合指数那么快。啊,对了,现在是MyISAM。对于这种查询有更好的选择吗?对不起,我对MyISAM不太了解。然而,经过再三考虑,如果没有组合索引,这可能是没有帮助的,即使是使用高级数据库,因为GROUP BY子句首先按GROUP_id分组。如果查询优化器使用事件_索引索引,那么它必须在执行GROUP BY之前在内存中构建一个临时结果表,这可能是一个非常大的表。因此,使用group_id索引是明智的——在这种情况下,整个分组是以流式方式完成的,不需要中间表。索引总是比任何数据库引擎优化都要出色。但是,索引在更新/插入/删除时会产生成本。在您的情况下,可能希望表中没有大多数索引,在尝试执行这些维护操作之前只构建那些特殊的索引,然后删除这些索引。