在Postgresql上实现KNN算法

需要了解操作符 <-> (linear distance)

1.没有索引的情况下

SELECT name, location
FROM geonames
ORDER BY location <-> '(29.9691,-95.6972)'
LIMIT 5;

2.创建GIST索引

CREATE INDEX idx_gist_geonames_location ON geonames USING gist(location);

创建索引需要时间和空间,并且数据改变时,需要重新创建索引。

再次执行查询

SELECT name, location
FROM geonames
ORDER BY location <-> '(29.9691,-95.6972)'
LIMIT 5;

3.创建SP-GIST索引

CREATE INDEX idx_spgist_geonames_location ON geonames USING spgist(location);

 创建索引需要时间和空间,并且数据改变时,需要重新创建索引。

再次执行查询

SELECT name, location
FROM geonames
ORDER BY location <-> '(29.9691,-95.6972)'
LIMIT 5;

 

索引名创建时间估计查询时间索引大小计划时间
未使用索引0M418749.73255.67600.493
GIST索引3M 1S1.160.939868MB0.786
SP-GIST索引1M 25S1.090.358523MB0.122

4.结论 

SP-GiST 的执行速度是 GiST 的两倍,计划速度快 8 倍,并且大约是磁盘大小的 60%。并且(与本文相关)它还支持从 PostgreSQL 12 开始的 KNN 索引搜索。

5.其他注意事项

本例子使用Postgresql原生的Point类型,没有使用Postgis中Point类型。

SP-GiST 索引不能用于排序和支持唯一约束。此外,不能在多个列上创建这样的索引(与 GiST 不同)。但是允许使用这样的索引来支持排除约束。这里与 GiST 的不同之处在于聚类是不可能的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值