MySQL: počasen NOT IN query

Zdravo,
imam dve tabeli.
Product
in
visitstat

SELECT id, name FROM Product ORDER BY name ASC LIMIT 100

100 rows in set (0.05 sec)

SELECT DISTINCT refId FROM visitstat WHERE type='P' AND date > '2010-10-02'

9 rows in set (0.08 sec)

SELECT id, name FROM Product WHERE id NOT IN (SELECT DISTINCT refId FROM visitstat WHERE type='P' AND date > '2010-10-02') ORDER BY name ASC LIMIT 100

100 rows in set (4 min 15.10 sec)

Ve kdo, v čem bi lahko bil problem?

15 odgovorov

Mislim da "name" ne rabi indexa, prej ga rabita "id" iz Products in "type" ter "date" iz visitstat.

kot je ze omenil blackmamba, vcasih se bolj splaca narediti dva querya :)
na strani imamo 200k+ slik in pri listanju galerij se je izkazalo za manj pozresno, ce na zacetku nafilam counte in idje slik, kot pa da bi jih iskal sproti v kaksnih joinih ali subqueryih

kelvan:
kot je ze omenil blackmamba, vcasih se bolj splaca narediti dva querya :)
na strani imamo 200k+ slik in pri listanju galerij se je izkazalo za manj pozresno, ce na zacetku nafilam counte in idje slik, kot pa da bi jih iskal sproti v kaksnih joinih ali subqueryih

V takem primeru ko računaš neko statistiko in ne rabi biti vsak query up to date pridejo zelo dobro tudi materialized view v uporabo :)

Evo ozko grlo je bilo z vašo pomočjo najdeno :)

ALTER TABLE visitstat ADD INDEX ref_id (refId);

In zdaj:

SELECT id, name FROM Product WHERE id NOT IN (SELECT DISTINCT refId FROM visitstat WHERE type='P' AND date > '2010-10-02') ORDER BY name ASC LIMIT 100;

100 rows in set (0.07 sec)

Bom moral najti kakšno literaturo o MySQL, v stilu "best practices".

1

yeah... indexi FTW