2011-09-23 2 views
0

J'ai cette requête et c'est très lent. Puis-je écrire cette requête autrement en évitant les sous-sélections par exemple?requête avoding subselect

i également essayé d'ajouter indice composite sur

MyIndex(kategorije_id,izdvojen,izdvojen_kad,datum) 

mais il doesent l'utiliser quand j'expliquer cette requête est donc là un autre indice que je peux utiliser pour accélérer cette recherche?

SELECT artikli.datum AS brojx, artikli.izdvojen AS i, artikli.izdvojen_kad AS ii, artikli.name 
FROM artikli 
WHERE artikli.izbrisan =0 
AND artikli.prodano !=3 
AND artikli.zavrseno =0 
AND artikli.od_id !=0 
AND kategorije_id 
IN (18) 
AND (
SELECT count(*) 
FROM artikli_polja, polja 
WHERE polja.id_kat = artikli.kategorije_id 
AND artikli_polja.id_polja = polja.id 
AND artikli_polja.id_artikal = artikli.id 
AND polja.name = "godiste" 
AND artikli_polja.valueInt >= "1993" 
) >0 
AND (
SELECT count(*) 
FROM artikli_polja, polja 
WHERE polja.id_kat = artikli.kategorije_id 
AND artikli_polja.id_polja = polja.id 
AND artikli_polja.id_artikal = artikli.id 
AND polja.name = "godiste" 
AND artikli_polja.valueInt <= "2000" 
) >0 
ORDER BY i DESC , ii DESC , brojx DESC 
LIMIT 140 , 35 
+0

'Limite x décalage y', devient plus lent lorsque le décalage augmente. – Johan

+1

Votre requête actuelle (lente) retournera une ligne de table artikli qui répond à tous les autres critères et a des lignes artikli_polja avec valueInt> = '1993' et <= '2000', même si ces conditions ne se produisent pas dans le même ** Ligne artikli_polja. Par exemple, si une ligne a valueInt 1990 et une autre a valueInt 2010, la ligne artikli liée sera sélectionnée. Est-ce le comportement que vous voulez? Sinon, voulez-vous que la ligne artikli soit sélectionnée seulement si elle répond aux autres critères et s'il y a au moins une ligne artikli_polja avec un valueInt qui est> = 1993 et ​​<= 2000? – UltraOne

Répondre

1

Essayez cette requête:

SELECT a.datum AS brojx, a.izdvojen AS i, a.izdvojen_kad AS ii, a.name 
FROM artikli a 
WHERE a.izbrisan =0 
AND a.prodano !=3 
AND a.zavrseno =0 
AND a.od_id !=0 
AND a.kategorije_id = 18 
AND EXISTS 
    (select 'X' 
    from artikli_polja ap, 
    JOIN polja p 
    ON ap.id_polja = p.id AND p.id_kat = a.kategorije_id 
    AND ap.id_artikal = a.id 
    AND p.name = 'godiste' 
    AND ap.valueInt >= 1993 AND ap.valueInt <= 2000 
    ); 

S'il vous plaît vérifier.

1

Essayez cette requête -

SELECT a.datum AS brojx, a.izdvojen AS i, a.izdvojen_kad AS ii, a.name FROM artikli a 
    JOIN artikli_polja ap 
    ON ap.id_artikal = a.id 
    JOIN polja p 
    ON ap.id_polja = p.id AND p.id_kat = a.kategorije_id 
WHERE 
    a.izbrisan =0 
    AND a.prodano !=3 
    AND a.zavrseno =0 
    AND a.od_id !=0 
    AND kategorije_id = 18 
    AND p.name = 'godiste' 
    AND ap.valueInt >= 1993 AND ap.valueInt <= 2000; 

J'ai enlevé ORDER BY et clauses LIMIT de la requête; essayez de développer cette requête d'abord.

+0

Drôle, je reçois toujours 1 à 3 lignes de plus sur votre requête quand je fais mysql_num_rows sur les deux types de requêtes. – sabansaulic

+0

Je vous suggère de trouver ces enregistrements et essayer de comprendre la raison. – Devart

+0

Cette requête est un peu différente de l'original. Il teste si une ligne particulière se situe entre 1993 et ​​2000, mais la requête d'origine teste s'il y a des lignes correspondantes au-dessus de 1993 et ​​s'il y a des lignes correspondantes en dessous de 2000. – Karolis

Questions connexes