Mysql
 sql >> Database >  >> RDS >> Mysql

L'utilizzo dell'istruzione OR su WHERE in MySql provoca un'esecuzione lenta

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.