2011-09-23 30 views
0

我有這個查詢,它非常緩慢。例如,我可以通過避免子查詢以其他方式編寫此查詢嗎?查詢avoding subselect

而且我試着

MyIndex(kategorije_id,izdvojen,izdvojen_kad,datum) 

加入綜合指數,但它doesent使用它時,我解釋這個查詢,以便在那裏,我可以用它來加快這個查詢另一個指標?

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

'Limit x offset y',隨着偏移量的增加而變慢。 – Johan

+1

您當前的(慢)查詢將返回符合所有其他條件的artikli表格行,並且具有valueInt> ='1993'和<='2000'的artikli_polja行,即使這些條件不會在**中出現** artikli_polja排。例如,如果一行的值爲1990而另一行的值爲2010,則鏈接的artikli行將被選中。這是你想要的行爲嗎?或者,您是否希望Artikli行僅在滿足其他條件時才被選中,並且至少有一個artIfli_polja行的值爲> = 1993且<= 2000的valueInt? – UltraOne

回答

1

嘗試此查詢:

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

請檢查。

1

嘗試此查詢 -

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; 

我已刪除ORDER BY和LIMIT子句從查詢;嘗試首先解決這個問題。

+0

有趣的是,當我在這兩種查詢類型上執行mysql_num_rows時,我總是在查詢中獲得1至3多行。 – sabansaulic

+0

我建議你找到這些記錄,並試圖瞭解原因。 – Devart

+0

此查詢與原始數據有點不同。它測試特定行是否在1993年到2000年之間,但原始查詢測試是否存在1993年以上的匹配行,以及2000年以下是否有匹配的行。 – Karolis