LIKE
bez zástupného znaku je ekvivalentní =
. Za předpokladu, že jste skutečně mysleli name = 'text'
.
Indexy jsou klíčem k výkonu.
Testovací nastavení
CREATE TABLE image (
image_id serial PRIMARY KEY
, group_id int NOT NULL
, name text NOT NULL
);
V ideálním případě vytvoříte dva indexy (kromě primárního klíče):
CREATE INDEX image_name_grp_idx ON image (name, group_id);
CREATE INDEX image_grp_idx ON image (group_id);
Druhý může není nutné, v závislosti na distribuci dat a dalších podrobnostech. Vysvětlení zde:
- Je složený index vhodný také pro dotazy na první pole?
Dotaz
To by mělo být nejrychlejší možné dotaz pro váš případ:
SELECT * FROM image WHERE name = 'name105' AND group_id = 10
UNION ALL
SELECT * FROM image WHERE name = 'name105'
UNION ALL
SELECT * FROM image WHERE group_id = 10
LIMIT 1;
SQL Fiddle.
LIMIT
klauzule se vztahuje na celý dotaz. Postgres je dostatečně chytrý, aby se nespustil pozdější větve UNION ALL
jakmile najde dostatek řádků pro splnění LIMIT
. Následně pro zápas v první SELECT
dotazu, výstup EXPLAIN ANALYZE
vypadá takto (posuňte se doprava! ):
Limit (cost=0.00..0.86 rows=1 width=40) (actual time=0.045..0.046 rows=1 loops=1) Buffers: local hit=4 -> Result (cost=0.00..866.59 rows=1002 width=40) (actual time=0.042..0.042 rows=1 loops=1) Buffers: local hit=4 -> Append (cost=0.00..866.59 rows=1002 width=40) (actual time=0.039..0.039 rows=1 loops=1) Buffers: local hit=4 -> Index Scan using image_name_grp_idx on image (cost=0.00..3.76 rows=2 width=40) (actual time=0.035..0.035 rows=1 loops=1) Index Cond: ((name = 'name105'::text) AND (group_id = 10)) Buffers: local hit=4 -> Index Scan using image_name_grp_idx on image (cost=0.00..406.36 rows=500 width=40) (never executed) Index Cond: (name = 'name105'::text) -> Index Scan using image_grp_idx on image (cost=0.00..406.36 rows=500 width=40) (never executed) Index Cond: (group_id = 10) Total runtime: 0.087 ms
Tučné zdůraznění moje.
Ne ne přidejte ORDER BY
doložka , tím by se zrušil účinek. Pak by Postgres musel zvážit všechny řádky, než vrátí horní řádek.
Poslední otázky
Existuje na to obecné řešení?
Toto je generické řešení. Přidejte tolik SELECT
prohlášení, jak chcete.
Samozřejmě by se to hodilo, kdyby byl výsledek vyhledávání seřazen podle jeho relevance.
Ve výsledku je pouze jeden řádek s LIMIT 1
. Druh třídění dutin.