Hirdetés

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

  • sztanozs
    veterán

    SELECT item_id, item_date
    FROM items
    WHERE 
    item_id IN (select item_id from items_categories where 
    category_id not in  (1,3,13,7,20) and 
    item_id not in (117,132,145,209,211))
    ORDER BY item_date DESC LIMIT 4

    (valami régi kódból maradt benne a neve, a feed_id az az item_id az index nevében)

    Mivel itt azt mondja, hogy az items_categories táblán nem használ indexet (key = NULL), ezért arra gondoltam, akkor létre hozok egy covering indexet ide:
    CREATE INDEX idx_category_id_item_id ON items_categories (category_id,item_id)

    A sebességen nem javított, de most már így néz ki az explain:

    ----------

    SELECT i.item_id, i.item_date
    FROM items as i INNER JOIN items_categories AS c ON i.item_id=c.item_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, i.item_date
    ORDER BY i.item_date DESC LIMIT 4

    Itt ha a
    GROUP BY i.item_id, i.item_date
    helyett
    GROUP BY i.item_id
    van, akkor ennyi a változás:

    De időben semmit nem jelent.

    A létrehozott index sokat nem segít, mivel az egy 'compound index' (csak akkor működik, ha egyszerre használod a két mezőt inkluzív keresésre, és egyszerre tudja használni mind a kettőt). Két külön indexszel talán valamit javulna.

    Amúgy akármit is csinálsz úgy tűnik a kapcsolótábla nagy mérete miatt - és mivel nem magát a táblát, hanem annak egy előszűrt nézetét használod - szinte biztosan lesz jelentős adatmozgás (ez látszik a "sending data" szekcióban).

    Ahogy nézem a mariadb nem igazán tudja rendesen használni az indexeket (pontosabban a MERGE módot), DISTINCT és/vagy GROUP BY kifejezésekkel együtt, mindenféleképp temp táblát szeretne alkalmazni.
    Ezért is kisebb az első esetben létrehozott temp tábla (mivel itt csak egy mező jön létre és ezzel hasonlítja össze az item_id-t). A második esetben meg létrehozza a joinolt temp táblát (három mezővel) és mivel utána group by/distinct van így nem MERGE-et használ, hanem csinál egy teljes table dump-ot :/

    Tényleg meg kell próbálni valami mással, mert még a MySQL doksiban is azt olvastam, hogy még pl a DISTINCT esetében is szépen kell működnie index-szel, ha a sorbarendezett mező sorbarendezett indexet használ.

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