LIKE
utan jokertecken motsvarar =
. Förutsatt att du faktiskt menade name = 'text'
.
Index är nyckeln till prestanda.
Testa installationen
CREATE TABLE image (
image_id serial PRIMARY KEY
, group_id int NOT NULL
, name text NOT NULL
);
Helst skapar du två index (utöver primärnyckeln):
CREATE INDEX image_name_grp_idx ON image (name, group_id);
CREATE INDEX image_grp_idx ON image (group_id);
Den andra maj inte nödvändigt, beroende på datadistribution och andra detaljer. Förklaring här:
- Är ett sammansatt index också bra för frågor i det första fältet?
Fråga
Detta bör vara snabbast möjliga fråga för ditt ärende:
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-fiol.
LIMIT
klausulen gäller för hela frågan. Postgres är smart nog att inte köra senare delen av UNION ALL
så snart den har hittat tillräckligt många rader för att uppfylla LIMIT
. Följaktligen för en match i den första SELECT
av frågan, utdata från EXPLAIN ANALYZE
ser ut så här (rulla åt höger! ):
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
Djärv betoning min.
Gör det inte lägg till en ORDER BY
klausul , detta skulle ogiltigförklara effekten. Då skulle Postgres behöva överväga alla rader innan den återvänder till den översta raden.
Sista frågor
Finns det en allmän lösning för det?
Detta är den generiska lösningen. Lägg till så många SELECT
uttalanden som du vill.
Naturligtvis skulle det vara praktiskt när sökresultatet sorteras efter dess relevans.
Det finns bara en rad i resultatet med LIMIT 1
. Typ av tomrumssortering.