Maison  >  Questions et réponses  >  le corps du texte

Utilisez plusieurs tables pour les jointures MySQL et évitez d'utiliser des méthodes de sous-requête

Ma requête en violon est la suivante.

select * from notification where status = 0 and (
 notif_id in (select notif_id from notif_user where user_id = 1) OR 
 notif_id in (select notif_id from notif_group where group_id = 1))

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=cad284e77218eb37461e60b6308bf85f

Les requêtes fonctionnent comme prévu. Mais y aura-t-il des problèmes de performances avec la requête. Est-il possible de convertir une requête interne en jointure ?

P粉442576165P粉442576165408 Il y a quelques jours454

répondre à tous(2)je répondrai

  • P粉567281015

    P粉5672810152023-09-08 16:30:03

    Votre sous-requête n'est pas dépendante d'une sous-requête, mais indépendante. Autrement dit, ils ne font pas référence aux colonnes de votre table notification, mais uniquement aux colonnes de leur propre table.

    Donc, pas de problèmes de performances ici.

    répondre
    0
  • P粉576184933

    P粉5761849332023-09-08 15:26:05

    Vous pouvez exprimer les sous-requêtes sous forme de requêtes syndicales et comparer les statistiques du plan d'exécution. En regardant le résultat dans fiddle, union semble fonctionner légèrement mieux.

    select * 
    from notification 
    where status = 0 and (
     notif_id in (
        select notif_id from notif_user where user_id = 1 union all
        select notif_id from notif_group where group_id = 1
      )
    );

    Une autre façon de l'exprimer est d'utiliser existe

    select * 
    from notification n 
    where status = 0 and
    (
      exists (select * from notif_user nu where nu.user_id = 1 and nu.notif_id = n.notif_id)
      or exists(select * from notif_group ng where ng.group_id = 1 and ng.notif_id = n.notif_id)
    );

    répondre
    0
  • Annulerrépondre