Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Die Verwendung von OR in der WHERE-Anweisung in MySql führt zu einer langsamen Ausführung

Ja, OR ist häufig ein Performance-Killer. Eine gängige Problemumgehung besteht darin, UNION auszuführen . Für Ihr Beispiel:

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

Wenn Sie sicher sind, dass es keine Dups gibt, wechseln Sie zum schnelleren UNION ALL .

Wenn Sie nicht nach fehlenden team_users fischen Zeilen verwenden Sie JOIN statt LEFT JOIN .

Wenn Sie ORDER BY benötigen , fügen Sie einige Klammern hinzu:

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

Ansonsten ORDER BY würde nur für das zweite SELECT gelten . (Wenn Sie auch „Paginierung“ benötigen, siehe mein Blog .)

Bitte beachten Sie, dass Sie möglicherweise auch LIMIT benötigen unter bestimmten Umständen.