sql >> Databasteknik >  >> RDS >> Mysql

Att använda OR on WHERE-satsen i MySql orsakar långsam exekvering

Ja, OR är ofta en prestationsdödare. En vanlig lösning är att göra UNION . För ditt exempel:

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

Om du är säker på att det inte finns dups, byt till den snabbare UNION ALL .

Om du inte fiskar efter saknade team_users rader, använd JOIN istället för LEFT JOIN .

Om du behöver ORDER BY , lägg till några föräldrar:

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

Annars visas ORDER BY skulle endast gälla för den andra SELECT . (Om du också behöver 'paginering', se min blogg .)

Observera att du kanske också behöver LIMIT under vissa omständigheter.



  1. Openshift och net-ssh inkompatibilitet? (2.9.3-beta1 mot 2.9.2)

  2. Hur genererar man automatiskt unikt ID i SQL som UID12345678?

  3. MySQL ODBC 5.1 Set Namn tillåts inte av drivrutinen

  4. Drop Column från Large Table