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表,在我们分析的时间段内每分钟都有一行,productionMinute并engineEvent在每个表的日期时间列上连接和表.因此,如果我们的分析时间是从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)
然而,这种联系带来了多种环境问题:
engineState表有500万行,productionMinute表有130,000行engineState行跨越超过一分钟(即,之间的差值es.state_start_time和es.state_end_time大于一分钟),如在上面的例子中的情况下,存在多个productionMinute其加入到一个表中的行engineState表行engineState表行连接到productionMinute一行在测试我们的逻辑并仅使用一个小表提取(表格的一天而不是3个月productionMinute)时,查询需要一个多小时才能生成.在研究这个项目以提高性能以便查询三个月的数据时,我们的想法是创建一个临时表engineEvent,消除任何对分析不重要的表数据,并加入临时表桌子到productionMinute桌子.我们还计划尝试不同的连接 - 特别是内部连接 - 以查看是否可以提高性能.
连接表的最佳查询设计是什么?如上所述,连接谓词之间有很多关系?什么是最好的连接类型(左/右,内)?
性能将取决于表中数据的结构。
仅当您希望左表或右表中的所有值用于所选投影,并且这些值在要连接的表中可能没有某些内容时,左外连接或右外连接才有用。
相信您的查询优化器会为您的数据找到最有效的连接算法...它的构建是为了知道如何做好它的工作。如果您遇到性能问题,请查看数据的结构和存储方式。
| 归档时间: |
|
| 查看次数: |
2275 次 |
| 最近记录: |