在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;
答案 0 :(得分:1)
您的查询都搞砸了,还不清楚您要做什么。
但是,我可以评论您的性能问题。 MySQL倾向于在FROM
子句中实现子查询。这意味着将创建表的新副本。这样做会使表上的索引丢失。因此,请消除FROM
子句中的子查询。
如果您用示例数据,期望的结果和一个体面的解释来问另一个问题,则可能可以帮助您实现更有效的查询形式。我怀疑您只想要not exists
,但是与这个问题相比,这是一个很大的飞跃。
答案 1 :(得分:1)
合并同一表的两个子查询。
你是什么意思?
如果您要从每个子查询中获取行,则只需
( 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]
。