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

kyvafyod  于 2023-10-15  发布在  Mysql
关注(0)|答案(4)|浏览(197)

LIMIT添加到EXISTS查询中是否有任何性能优势,或者MySQL会自己应用限制?
范例:

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

zpgglvta1#

EXISTS()的目的是执行查询 * 直到 * 它可以确定该表中是否有 * 任何 * 行匹配WHERE子句。也就是说,它在逻辑上与LIMIT 1做同样的事情。EXISTS在某些圈子中可能被称为semi-join
底线是:不要在EXISTS()中使用LIMIT 1
补遗:正如保罗指出的,LIMIT * 和OFFSET(或LIMIT m,n)确实有意义。

jrcvhitl

jrcvhitl2#

稍微摆弄一下我的查询,我注意到如果LIMIT设置为0,EXISTS仍然返回1。我想这表明它被忽略了。

xytpbqjk

xytpbqjk3#

这取决于你的表(my_table)中有多少条记录。如果记录不是太多,那么你不会看到任何性能提高,但如果你的表有太多的记录,那么你会看到性能提高,但这也取决于许多因素,因为你在列中有索引,这些索引正在被用于选择(如果你这样做,那么你也会得到覆盖索引的好处)。

qrjkbowd

qrjkbowd4#

这个问题已经提出很久了。如果有人需要一个变通办法,我发布了一个解决方案。
如上所述,限制在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
    );

相关问题