在MySQL中,最有效的查询设计是什么,用于连接大型表,连接谓词之间有多对多的关系?

lig*_*e65 9 mysql sql performance join

在我们的应用中,我们收集有关汽车发动机性能的数据 - 基本上是基于发动机类型,运行它的车辆和发动机设计的发动机性能的源数据.目前,新行插入的基础是发动机开关期; 我们根据引擎状态从活动状态到非活动状态的变化监控性能变量,反之亦然.相关engineState表格如下所示:

+---------+-----------+---------------+---------------------+---------------------+-----------------+
| vehicle | engine    | engine_state  | state_start_time    | state_end_time      | engine_variable |
+---------+-----------+---------------+---------------------+---------------------+-----------------+
| 080025  | E01       | active        | 2008-01-24 16:19:15 | 2008-01-24 16:24:45 |             720 | 
| 080028  | E02       | inactive      | 2008-01-24 16:19:25 | 2008-01-24 16:22:17 |             304 |
+---------+-----------+---------------+---------------------+---------------------+-----------------+ 
Run Code Online (Sandbox Code Playgroud)

对于特定分析,我们希望基于行的分钟粒度来分析表内容,而不是基于活动/非活动引擎状态的当前基础.为此,我们考虑创建一个简单的productionMinute表,在我们分析的时间段内每分钟都有一行,productionMinuteengineEvent在每个表的日期时间列上连接和表.因此,如果我们的分析时间是从2009年12月1日到2010年2月28日,我们将创建一个包含129,600行的新表,每三天一个月的每一分钟一行.productionMinute表格的前几行:

+---------------------+ 
| production_minute   |
+---------------------+
| 2009-12-01 00:00    |
| 2009-12-01 00:01    |
| 2009-12-01 00:02    |     
| 2009-12-01 00:03    |
+---------------------+
Run Code Online (Sandbox Code Playgroud)

表之间的连接将是:

     FROM engineState AS es 
LEFT JOIN productionMinute AS pm ON pm.production_minute >= es.state_start_time 
                                AND pm.production_minute <= es.event_end_time 
Run Code Online (Sandbox Code Playgroud)

然而,这种联系带来了多种环境问题:

  1. engineState表有500万行,productionMinute表有130,000行
  2. 当一个engineState行跨越超过一分钟(即,之间的差值es.state_start_timees.state_end_time大于一分钟),如在上面的例子中的情况下,存在多个productionMinute其加入到一个表中的行engineState表行
  3. 如果在任何给定的分钟内有多个引擎处于运行状态,同样如上例所示,多个engineState表行连接到productionMinute一行

在测试我们的逻辑并仅使用一个小表提取(表格的一天而不是3个月productionMinute)时,查询需要一个多小时才能生成.在研究这个项目以提高性能以便查询三个月的数据时,我们的想法是创建一个临时表engineEvent,消除任何对分析不重要的表数据,并加入临时表桌子到productionMinute桌子.我们还计划尝试不同的连接 - 特别是内部连接 ​​- 以查看是否可以提高性能.

连接表的最佳查询设计是什么?如上所述,连接谓词之间有很多关系?什么是最好的连接类型(左/右,内)?

joe*_*son 0

性能将取决于表中数据的结构。

仅当您希望左表或右表中的所有值用于所选投影,并且这些值在要连接的表中可能没有某些内容时,左外连接或右外连接才有用。

相信您的查询优化器会为您的数据找到最有效的连接算法...它的构建是为了知道如何做好它的工作。如果您遇到性能问题,请查看数据的结构和存储方式。