在 EXISTS
查询中添加 LIMIT
是否能提高性能,还是 MySQL 会自己应用限制?
例如:
IF EXISTS (
SELECT 1
FROM my_table
LIMIT 1 -- can this improve performance?
)
THEN ... END IF;
在 EXISTS
查询中添加 LIMIT
是否能提高性能,还是 MySQL 会自己应用限制?
例如:
IF EXISTS (
SELECT 1
FROM my_table
LIMIT 1 -- can this improve performance?
)
THEN ... END IF;
EXISTS()
的目的是只执行查询,直到它可以确定是否有任何行在该表中匹配WHERE
子句。换句话说,它在逻辑上执行与LIMIT 1
相同的操作。在某些场合,EXISTS
可能被称为半连接(semi-join)
。
总之:不要在EXISTS()
内使用LIMIT 1
。
补充说明:正如Paul所指出的,带有OFFSET
(或LIMIT m,n
)的LIMIT
确实有意义。
LIMIT
设置为0,EXISTS
仍然返回1。我认为这表明它被忽略了。
LIMIT 0
是一个异常的边缘情况。 - Rick James问题提交已经有很长时间了。如果有人需要一个解决方法,我在这里发布一个解决方案。
如上所述,在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
);
EXPLAIN
吗? - Tim Biegeleisenmy_table
中有很多行,那么确实如此。 - shmosel