具有多个左联接的查询性能问题

问题描述

在mysql v8.x中,我有一个包含约7000条记录的表。我正在尝试创建一个结合了同一表的两个子查询的查询。

我认为我可以通过以下方法实现此目的:左键连接子查询,然后匹配具有这些值的任何记录,如下例所示(注意:当my_table仅具有一个id列时,会发生这种情况)。

当子查询返回记录时,该查询似乎工作很快,但当子查询返回空值时(在下面的示例中使用WHERE FALSE重新创建了该查询),该查询似乎工作很快。发生这种情况时,可能会自行执行这些查询,每个查询花费一毫秒左右的时间,需要12秒钟。

我的理解是,这些连接应返回与源表相同的行数,因此应该没有太大的区别。我有兴趣了解联接在这种情况下如何工作,以及为什么会在执行时间上产生如此大的差异。

SELECT my_table.* FROM accessory_requests 
  LEFT JOIN 
     ( SELECT my_table.id 
         FROM my_table  
        WHERE FALSE
     ) as join1
    ON join1.id = my_table.id 
  LEFT JOIN 
     ( SELECT my_table.id 
         FROM my_table
        WHERE FALSE 
     ) as join2
    ON join2.id = my_table.id 
 WHERE join1.id IS NOT NULL OR join2.id IS NOT NULL;

解决方法

您的查询都搞砸了,还不清楚您要做什么。

但是,我可以评论您的性能问题。 MySQL倾向于在FROM子句中实现子查询。这意味着将创建表的新副本。这样做会使表上的索引丢失。因此,请消除FROM子句中的子查询。

如果您用示例数据,期望的结果和一个体面的解释来问另一个问题,则可能可以帮助您实现更有效的查询形式。我怀疑您只想要not exists,但是与这个问题相比,这是一个很大的飞跃。

,

合并同一表的两个子查询。

你是什么意思?

如果您要从每个子查询中获取行,则只需

( SELECT ... )  -- what you are calling the first subquery
UNION 
( SELECT ... )  -- 2nd

LEFT JOIN  ( ... ) as join1  ON ...
 WHERE join1.id IS NOT NULL;

可能与简单

相同
JOIN  ( ... ) as join1  ON ...

如果“合并”是指要包含多列,请参见标签[pivot-table]

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...