Sim,
OR
é frequentemente um assassino de desempenho. Uma solução comum é fazer UNION
. Para o seu exemplo:SELECT *
FROM `posts`
LEFT JOIN `teams_users`
ON (teams_users.team_id=posts.team_id
AND teams_users.user_id='7135')
WHERE (teams_users.status='1')
UNION DISTINCT
SELECT *
FROM `posts`
LEFT JOIN `teams_users`
ON (teams_users.team_id=posts.team_id
AND teams_users.user_id='7135')
WHERE (posts.user_id='7135');
Se você tiver certeza de que não há dups, mude para o
UNION ALL
mais rápido . Se você não está procurando por
team_users
ausentes linhas, use JOIN
em vez de LEFT JOIN
. Se você precisar de
ORDER BY
, adicione alguns parênteses:( SELECT ... )
UNION ...
( SELECT ... )
ORDER BY ...
Caso contrário, o
ORDER BY
se aplicaria apenas ao segundo SELECT
. (Se você também precisar de 'paginação', veja meu blog
.) Observe que você também pode precisar de
LIMIT
em certas circunstâncias.