2009-10-06 7 views
0

J'ai cette requête, qui exécute en 1 ou 2 secondes pour un cas donné:multiples Inscrivez-vous ou optimisation des requêtes de sous-requête

Select Count(*) as qtty 
    From event e 
    Join org o On o.orgID = e.orgID 
    Join venue v On v.venueID = e.venueID 
    Where Match(e.name, e.description) Against ($keywords) 
     And e.site_id = $site_id 
     And e.display <> 0</code> 

Il compte les lignes à construire la pagination. Quand j'introduit le filtrage par type d'événement (types sont liés plusieurs à plusieurs des événements) la requête a commencé à prendre pas moins de 45 secondes:

And Exists ( 
     Select ete.id 
     From event_type_to_event ete 
     Where ete.event_id = e.eventID 
     And ete.event_type_id = $category)</code> 

J'ai essayé aussi se joindre à event_type_to_event mais il était encore plus lent.
Des suggestions?

REMARQUE: Résolu. En utilisant des index, le temps d'exécution de la requête est passé à moins d'une seconde.

+1

s'il vous plaît coller le résultat de la requête EXPLIQUER –

Répondre

1

Je soupçonne que vous devez ajouter un index sur la event_type_id colonne dans le tableau event_type_to_event, mais s'il y a déjà un indice là, essayez ce qui suit:

Select Count(*) as qtty 
From event e 
    Join org o On o.orgID = e.orgID 
    Join venue v On v.venueID = e.venueID 
Where Match(e.name, e.description) Against ($keywords) 
    And e.site_id = $site_id 
    And e.display <> 0 
    And Exists 
     (Select * From event_type_to_event 
     Where event_id = e.eventID 
      And event_type_id = $category) 

Si EVENT_ID est le PK de la table event_type_to_event vous peut également essayer une jointure au lieu d'utiliser eXISTE,

Select Count(*) as qtty 
From event e 
    Join org o On o.orgID = e.orgID 
    Join venue v On v.venueID = e.venueID 
    Join event_type_to_event t 
     On t.event_id = = e.eventID 
Where Match(e.name, e.description) Against ($keywords) 
    And e.site_id = $site_id 
    And e.display <> 0 
    And t.event_type_id = $category 
+0

Merci! Je dois admettre non sans quelque honte que c'est la première fois que je vois vraiment la différence d'utiliser des indices! (un nouveau DB) Quoi qu'il en soit, la deuxième requête ne fonctionnera pas, car event_type_to_event est une table 'many-to-many' donc elle devrait aussi être groupée par identifiant d'événement, mais j'ai aussi essayé, et sans index, c'est plus lent que la sous-requête. Merci! – Petruza

Questions connexes