寻找两个表/查询之间的双左连接的改进

Posted

技术标签:

【中文标题】寻找两个表/查询之间的双左连接的改进【英文标题】:Looking for improvement on double left join between two tables/queries 【发布时间】:2019-04-29 09:31:14 【问题描述】:

我有一个查询,它使用双连接,两个左连接,从一个表到一个查询。它工作正常,但最近我注意到一些滞后,因为更多记录被添加到基础表中。我担心的是滞后,想知道是否有更好的方法来解决这个问题。

我还对嵌套查询进行了一些研究,但我的尝试并没有给我想要的输出/结果。

SELECT 
 BulkStockV1.TyreIndividualID, 
 BulkStockV1.TyrePatternID, 
 BulkStockV1.TyreStatusID, 
 qSelStockFitmentNew.JobCardDate,
 qSelStockFitmentNew.JobCardNumber, 
 qSelStockFitmentNew.Horse_ID, 
 qSelStockFitmentNew.Trailer_ID, 
 qSelStockFitmentNew.WheelPos, 
 BulkStockV1.BulkOrderID, 
FROM BulkStockV1 
LEFT JOIN qSelStockFitmentNew 
**ON (BulkStockV1.TyrePatternID = qSelStockFitmentNew.Pattern_ID) 
AND (BulkStockV1.TyreIndividualID = qSelStockFitmentNew.TyreIndividual_ID)**
ORDER BY 
 qSelStockFitmentNew.JobCardDate, 
 qSelStockFitmentNew.JobCardNumber, 
 qSelStockFitmentNew.Horse_ID, 
 qSelStockFitmentNew.Trailer_ID, 
 qSelStockFitmentNew.WheelPos, 
 BulkStockV1.TyreIndividualID;

我已尝试删除第二个连接,它加快了查询速度,但结果/输出也发生了变化。

【问题讨论】:

在您提供的查询中,只有 1 个左连接表。另一张桌子在哪里? 查看我之前的回复。 BulkStockV1 是一个表,左连接到另一个查询 qSelstockFitmentNew。 请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码&所需输出&明确规范&解释。对于包含 DDL(包括索引)的 SQL,对于 SQL 性能,它包括 EXPLAIN 输出。 对不起,我不明白我在这里做错了什么...... 【参考方案1】:

对于这个查询:

SELECT . . . 
FROM BulkStockV1 bs LEFT JOIN
     qSelStockFitmentNew sfn
     ON bs.TyrePatternID = sfn.Pattern_ID AND
        bs.TyreIndividualID = sfn.TyreIndividual_ID
ORDER BY . . .

首先,BulkStockV1 可能是一个视图。至少,这就是我对V1 的解释。如果是这样,那么这可能是您的性能问题的原因。

对于此查询,您需要qSelStockFitmentNew(Pattern_ID, TyreIndividual_ID) 上的单个复合索引。因为这是LEFT JOIN,所以第二张表上的索引更好。

您有一个ORDER BY。唉,它混合了两个表中的列,因此您无法使用索引消除排序。

【讨论】:

我正忙于对我的数据库进行一些重组,因为确定了新的需求。我复制了现有表(Bulkstock),以便能够在不影响数据的情况下测试一些想法。 BulkStockv1 是这个重复的表,而不是视图。 表 BulkStockV1 因此左连接到查询 qSelStockFitmentNew。由于 Order By 仅在查询中的字段上,如果我首先在查询 qSelFitmentNew 中进行排序会有帮助吗?

以上是关于寻找两个表/查询之间的双左连接的改进的主要内容,如果未能解决你的问题,请参考以下文章

mysql多个表之间的连接方式(内连接左连接右连接)delete删除表内数据的方法以及mysql索引

MYSQL 连表查询及别名用法

使用来自两个不同数据库的两个表使用 JOOQ 构建左连接查询

内连接,外链接(左连接右连接全连接),交叉连接

oracle表之间的连接

使用子查询改进 MySql 查询左外连接