在 EXISTS 查询中使用 LIMIT 有什么意义吗?

23

EXISTS 查询中添加 LIMIT 是否能提高性能,还是 MySQL 会自己应用限制?

例如:

IF EXISTS (
    SELECT 1
      FROM my_table
     LIMIT 1    -- can this improve performance?
)
THEN ... END IF;

是的...这样做可以提高性能,因为您正在限制记录。 - Abhishek Ginani
你尝试过使用 EXPLAIN 吗? - Tim Biegeleisen
@TimBiegeleisen,是的,它似乎没有受到影响。 - shmosel
@TimBiegeleisen,如果你的意思是my_table中有很多行,那么确实如此。 - shmosel
1
@AbhishekGinani 我不这么认为。SQL足够聪明,只做必要的事情。一旦找到任何记录,它就会停止。这就是它的目的。 - Robo Robok
4个回答

29
EXISTS() 的目的是只执行查询,直到它可以确定是否有任何行在该表中匹配WHERE子句。换句话说,它在逻辑上执行与LIMIT 1相同的操作。在某些场合,EXISTS可能被称为半连接(semi-join)

总之:不要在EXISTS()内使用LIMIT 1

补充说明:正如Paul所指出的,带有OFFSET(或LIMIT m,n)的LIMIT确实有意义。


3
在 EXISTS 子查询中,LIMIT 似乎被忽略了。但是如果您想定义一个 OFFSET 并且想要检查是否至少存在 N 行,则需要使用它。 - Paul Spiegel

3
调整我的查询后,我注意到即使将LIMIT设置为0,EXISTS仍然返回1。我认为这表明它被忽略了。

我建议 LIMIT 0 是一个异常的边缘情况。 - Rick James
1
这是一个概念验证案例。 - Luca C.

0
这取决于您的表(my_table)中有多少记录。如果记录不太多,那么您将看不到任何性能改进,但如果您的表有太多记录,则您将看到性能改进,但这也取决于许多因素,例如您在选择中使用的列中是否有索引(如果您这样做,那么您将获得覆盖索引的好处)。

0

问题提交已经有很长时间了。如果有人需要一个解决方法,我在这里发布一个解决方案。

如上所述,在EXISTS块中限制被忽略了。然而,如果我们将子查询作为EXISTS的主查询,我们可以将LIMIT应用于子查询。在这种情况下,子查询就像一个LATERAL,为条件提供数据。

SELECT
    ...
FROM
    your_table AS outer_table
WHERE
    ...
    AND EXISTS (
        SELECT 
            1
        FROM (
            -- This subquery is working as a LATERAL, so follow the same structure.
            SELECT
                condition_row
            FROM
                inner_table
            WHERE
                ...
                -- Make sure the subquery is referencing the required entries. (for example if the result blunges to the same account)
                AND inner_table.reference=outer_table.reference
            -- If applying any ordering.
            ORDER BY inner_events.ordering_row ASC
            LIMIT 1
        ) AS subquery
        where
            -- Check if the rest of the EXISTS condition here.
            your_condition=subquery.condition_row
    );

2
不确定你在这里想要达到什么目标。 - undefined
@shmosel 上述是使用LIMIT在EXISTS中的一个示例。我遇到的一个例子是优化一个查询,该查询使用一个LATERAL子查询,该子查询需要检查按创建日期排序的第一个条目是否符合条件。希望这个解释能帮助澄清用法。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,