Hirdetés

Keresés

Új hozzászólás Aktív témák

  • Taci

    addikt

    válasz martonx #5100 üzenetére

    Próbáltam azt is, kicseréltem a *-ot 2 mezőre, de csak minimálisat gyorsult, annyit, amennyivel kevesebb adatot kellett visszaadnia. (Jelen lekérdezésnél 18mp helyett 17mp.)

    Próbáltam azt is, hogy a most fent lévő xampp lite mellé felraktam a legfrissebb xampp-ot is, feltöltöttem adatokkal - és ugyanez a helyzet. Szóval nem a rendszer valamilyen hibája.

    Annyit vettem észre "változást", hogy a "Copying To Tmp Table On Disk" helyett most a "Sending Data" veszi el a sok időt. De a végeredmény ugyanolyan lassú.

    @bambano: Distinct-et nem használok, mert a join-olás miatt 1-1 bejegyzéshez az eredeti táblában (itt item) több kategória is tartozik, azok így több külön rekordba kerültek, és mivel így van több unique rekord ugyanahhoz az item_id-hoz, így sajnos nekem nem jó. (Mivel pont hogy az item_id-ra akartam volna használni a distinct-et.)

    -----

    Gondoltam, megnézem már, hogy a lekérdezés melyik része lassítja le az egészet amúgy.
    Így néznek ki:

    Where, Group By, Order By nélkül:
    SELECT i.item_id, i.item_date
    FROM items AS i 
    JOIN items_categories AS ic 
        ON i.item_id = ic.item_id 
    JOIN categories AS c 
        ON c.category_id = ic.category_id

    Showing rows 0 - 24 (901830 total, Query took 0.0165 seconds.)

    Egy kérdés itt:
    Amúgy az miért van, hogy habár azt írja ki, hogy 0.01 mp-ig tartott a lekérdezés, mégis, a lekérdezés indítása után kb. 5-7 mp-cel jelenítette csak meg ezt az eredményt?
    A lekérdezés gyors, de mégis csiga lassan adja vissza az eredményt?
    Most akkor a szememnek higgyek vagy az adatoknak?

    ------

    Group By, Order By nélkül:
    SELECT i.item_id, i.item_date
    FROM items AS i 
    JOIN items_categories AS ic 
        ON i.item_id = ic.item_id 
    JOIN categories AS c 
        ON c.category_id = ic.category_id 
    WHERE 
    c.category_id NOT IN (1,3,13,7,20) 
    AND 
    i.item_id NOT IN (117,132,145,209,211)

    Showing rows 0 - 24 (768981 total, Query took 0.0351 seconds.)
    ------

    Group By nélkül:
    SELECT i.item_id, i.item_date
    FROM items AS i 
    JOIN items_categories AS ic 
        ON i.item_id = ic.item_id 
    JOIN categories AS c 
        ON c.category_id = ic.category_id 
    WHERE 
    c.category_id NOT IN (1,3,13,7,20) 
    AND 
    i.item_id NOT IN (117,132,145,209,211)
    ORDER BY i.item_date DESC LIMIT 4

    Showing rows 0 - 3 (4 total, Query took 0.0420 seconds.)
    ------

    Minden benne:
    SELECT i.item_id, i.item_date
    FROM items AS i 
    JOIN items_categories AS ic 
        ON i.item_id = ic.item_id 
    JOIN categories AS c 
        ON c.category_id = ic.category_id 
    WHERE 
    c.category_id NOT IN (1,3,13,7,20) 
    AND 
    i.item_id NOT IN (117,132,145,209,211)
    GROUP BY i.item_id 
    ORDER BY i.item_date DESC LIMIT 4

    Showing rows 0 - 3 (4 total, Query took 2.5095 seconds.)
    ------

    Szóval Group By (vagy Distinct) nélkül gyors a lekérdezés (bár mintha erre is lett volna cáfolat korábban, már nem tudom, annyi tesztet csináltam, már kavarodnak az eredmények).
    Közben átmentem a másik (lokál) szerverre, és ott meg ugyanez a lekérdezés már az Order By-jal is belassul... Tök jó, hogy mindig változó eredményt kap, segít megtalálni a hibát...

    Még annyi ötletem van, hogy választok egy szolgáltatót, és reménykedem benne, hogy csak az én lokál telepítéseimen szerencsétlenkedik a kód (és én), és éles szerveren rendben lesz.

    Egy kérdés:
    Ha egyszer tényleg jó lenne a lekérdezés (mármint Group By vagy Distinct nélkül), hogyan tudnám "pótolni" azok funkcióját?

    Mert tegyük fel, ezeket a rekordokat adta vissza most eredményül:
    item_id | category_id | item_date
    11 | 32 | 211
        11 |          27 |       211
        11 |          13 |       211
        35 |          7 |       165

    De így a 11-es item_id 3-szor szerepel, nekem pedig az kell, csak 1-szer legyen, akármi is van.

    A Distinct nem jó, mert a különböző category_id-k miatt egyedi minden rekord, tehát szerepelni fog mind ugyanúgy külön.
    A Group By nem jó, mert szörnyen lelassítja.

    Milyen megoldás jöhet még szóba?

Új hozzászólás Aktív témák