akretschmer
Datenbank-Guru
- Beiträge
- 10.369
Stellt Euch vor: ihr habt eine Datenbank mit 100000 Artikeln. Nun sucht ihr ein Artikel, der 'um die 50 Euro' kosten soll - also entweder knapp unter oder knapp über 50 Euro. Wie sucht man sowas effektiv?
Wikipedia kennt dafür KNN: http://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm
PostgreSQL kennt das auch ;-)
PG kann das natürlich auch auf Geodaten anwenden: suche mir, ausgehend von meinem Standort, die nächsten Geldautomaten, Gaststätten oder Kinos. Indexbasierte Umkreissuche - eine sehr coole Sache!
Wikipedia kennt dafür KNN: http://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm
PostgreSQL kennt das auch ;-)
Code:
test=# create table artikel as select s as id, random() * 1000 as preis from generate_series(1,100000) s;
SELECT 100000
Time: 177,276 ms
test=*# create index idx_preis on artikel using gist (preis);
CREATE INDEX
Time: 1743,776 ms
test=*# analyse artikel;
ANALYZE
Time: 52,840 ms
test=*# explain analyse select * from artikel order by 50 <-> preis limit 5;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.28..0.58 rows=5 width=12) (actual time=0.190..0.199 rows=5 loops=1)
-> Index Scan using idx_preis on artikel (cost=0.28..6056.28 rows=100000 width=12) (actual time=0.189..0.198 rows=5 loops=1)
Order By: (preis <-> 50::double precision)
Total runtime: 0.230 ms
(4 rows)
Time: 0,572 ms
test=*# select * from artikel order by 50 <-> preis limit 5;
id | preis
-------+------------------
91560 | 49.9983592890203
73813 | 49.995846580714
12922 | 49.9917855486274
37169 | 50.0118038617074
65564 | 49.9865873716772
(5 rows)
PG kann das natürlich auch auf Geodaten anwenden: suche mir, ausgehend von meinem Standort, die nächsten Geldautomaten, Gaststätten oder Kinos. Indexbasierte Umkreissuche - eine sehr coole Sache!