Hirdetés

Keresés

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

  • Taci

    addikt

    válasz martonx #5067 üzenetére

    Megvan a "bűnös": az ORDER BY.

    SELECT DISTINCT * 
    FROM feeds AS f 
    JOIN feed_item_categories AS fic 
        ON f.feed_id = fic.feed_id 
    JOIN categories AS c 
        ON c.category_id = fic.category_id 
    WHERE 
    c.category_id NOT IN (1,3,13,7,20) 
    AND 
    f.feed_id NOT IN (101,456,3566,32345,56432,223444,344456) 
    ORDER BY f.feed_date DESC LIMIT 4

    Ha benne van: Showing rows 0 - 3 (4 total, Query took 19.2113 seconds.)
    Ha nincs benne: Showing rows 0 - 3 (4 total, Query took 0.0541 seconds.)

    Pedig indexelt a feed_date.

    Amikor explain-nel megkérdezem, mi történik, ezt mondja:
    table: f
    type: index
    possible_keys: PRIMARY
    key: feed_date
    rows: 298917
    Extra: Using where; Using index; Using temporary; Using f...

    A "régi" lekérdezést miért nem lassítja be az ORDER BY?

    SELECT * FROM feeds 
    WHERE
    (feed_category NOT LIKE '%cat1%'
    OR feed_category NOT LIKE '%cat2%'
    OR feed_category NOT LIKE '%cat3%'
    OR feed_category NOT LIKE '%cat4%')
    ORDER BY feed_date DESC LIMIT 4

    (Nem pont ugyanazt csinálja, mint a felső, csak azért másoltam be, hogy meglegyen, melyik a "régi".)

    0.3591 seconds

    Egyértelműen látszik, mennyivel gyorsabb a JOIN-os megoldás, de az a baj, hogy, hogy kell az ORDER BY - vagy legalábbis az lenne a fontos, hogy a leszűkített (WHERE) rekordlista teljes tartalmát időrendileg csökkenő sorrendben kell visszaadnom, négyesével.
    Ezért csináltam úgy már eredetileg is, hogy megvan a feltételek alkalmazása (WHERE), aztán a találati lista rendezése (ORDER BY), aztán az első 4 listázása.
    Aztán következő lekérdezésnél ugyanígy, csak a már korábban kilistázott elemek kizárása (id NOT IN...).

    Tudnátok tanácsot adni, kérlek?

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