Mysql
 sql >> Base de données >  >> RDS >> Mysql

L'utilisation de OR sur l'instruction WHERE dans MySql entraîne une exécution lente

Oui, OR est souvent un tueur de performance. Une solution de contournement courante consiste à faire UNION . Pour votre exemple :

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');

Si vous êtes sûr qu'il n'y a pas de doublons, passez au plus rapide UNION ALL .

Si vous ne cherchez pas les team_users manquants lignes, utilisez JOIN au lieu de LEFT JOIN .

Si vous avez besoin de ORDER BY , ajoutez des parenthèses :

( SELECT ... )
UNION ...
( SELECT ... )
ORDER BY ...

Sinon, le ORDER BY ne s'appliquerait qu'au deuxième SELECT . (Si vous avez également besoin de 'pagination', consultez mon blog .)

Veuillez noter que vous pourriez également avoir besoin de LIMIT dans certaines circonstances.