Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Usar OR na instrução WHERE no MySql causa lentidão na execução


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.