【发布时间】:2021-07-22 21:28:29
【问题描述】:
这个查询在 MySql 8 中需要很长时间才能完成,做一些研究我发现这个代码中的“EXISTS”在某些查询中可能非常慢。 当我删除“OR EXISTS”子查询部分时,它会在不到一秒的时间内运行。
所以我需要在这个查询中替换“OR EXISTS”,这样我就可以获得我需要的所有用户:
SELECT u.name,
u.email,
u.cpf,
u.register,
r.name AS role_name,
s.name AS sector_name,
b.name AS branch_name,
u.status
FROM users u
INNER JOIN roles r ON r.id = u.role_id
INNER JOIN sectors s ON s.id = u.sector_id
INNER JOIN branches b ON b.id = u.branch_id
WHERE u.status = 2 OR EXISTS (
SELECT *
FROM user_recovery ur
WHERE ur.user_id = u.id
AND ur.status_recovery = 1
)
有没有办法在没有“OR EXISTS”的情况下做到这一点?
【问题讨论】:
-
不要忘记现代数据库做了很多查询优化。例如,您可以在
EXITS中更改为SELECT 1 ...,但不确定是否已经完成了类似的操作。 -
@PM77-1 - 嗯,MySQL 还是有点“简单”。我的答案应用了两个我从未见过的优化。
-
OR是慢的部分,而不是EXISTS。 -
left outer joinuser touser_recoveryifuser_recovery在 user_id 上是唯一的。如果不是,则从用户恢复中派生一个具有不同 user_id 的表并加入该表,然后 OR。
标签: mysql sql performance