Sì, OR è spesso un killer di prestazioni. Una soluzione comune è eseguire UNION . Per il tuo esempio:
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 sei sicuro che non ci siano duplicati, passa al più veloce UNION ALL .
Se non stai cercando team_users mancanti righe, usa JOIN invece di LEFT JOIN .
Se hai bisogno di ORDER BY , aggiungi alcune parentesi:
( SELECT ... )
UNION ...
( SELECT ... )
ORDER BY ...
Altrimenti, il ORDER BY si applicherebbe solo al secondo SELECT . (Se hai bisogno anche di 'impaginazione', vedi il mio blog
.)
Tieni presente che potresti anche aver bisogno di LIMIT in determinate circostanze.