PostgreSQL & PostGIS 附近的人

2015-01-19 20:58:17 +08:00
 cevincheung

0.说点啥

一直使用MongoDB来做的线上产品LBS检索,随着数据量的增长慢慢的越来越慢,研究了一下PostgreSQL+PostGIS,经实际数据测试感觉还差不多。1000w数据排序检索耗时0.0019s。

1.PostGIS安装过程

下载: http://www.postgis.net
安装:自己Google

2.建表

-- 只给出gis字段
select AddGeometryColumn('表名','要添加的字段名',4326,'geometry',0);
-- 4326对应的是WGS84坐标系 中国使用的是该类型

有关WGS84坐标系介绍及深入了解请点这里......

3.插入数据

insert into table_name
    (name,geometry_column)
values
    ('用户1', ST_GeometryFromText('POINT(longitude latitude)',4326))

4.附近的人搜索

select
    *,
    ST_Distance_Sphere(
                      geometry_column,
                      ST_GeometryFromText('POINT(longitude latitude)',
                      4326
                      ) distance
from
    table_name
order by
    geometry_column <-> ST_GeometryFromText('POINT(longitude latitude)',4326)
LIMIT 10 offset 0
11267 次点击
所在节点    PostgreSQL
21 条回复
mywaiting
2015-01-19 21:21:54 +08:00
GIS这个对于pg来说,是个挺好的实现。传闻中instagram就是因为这个而选择了pg
pichina
2015-01-19 23:13:57 +08:00
1000w数据是随机生成的么?
markyangd
2015-01-19 23:43:34 +08:00
gis专业的低头走过
cevincheung
2015-01-19 23:54:54 +08:00
@pichina Google地图POI数据
cevincheung
2015-01-19 23:55:37 +08:00
@markyangd 学校里会教postgresql么?
cevincheung
2015-01-19 23:56:04 +08:00
@mywaiting 又收集了一个案例,居然不知道instagram用pg……(捂脸)
zado
2015-01-20 00:20:28 +08:00
请问 "1000w数据排序检索耗时0.0019s " 是个什么概念?
就是有1000万个坐标数据,查找出某一个坐标相邻的 10个坐标需用时 0.0019秒 的意思吗?也就是大概每秒钟能查找500次的样子对吗?
cevincheung
2015-01-20 00:41:49 +08:00
@zado
不知道你咋算的。默认配置mongodb需要3s
zado
2015-01-20 01:00:31 +08:00
@cevincheung 1秒 除以 0.0019秒 等于 526.32次 ,我是这样算的。
“默认配置mongodb需要3s” mongodb需要3s才能查询到1个结果吗?
很抱歉,我对PostgreSQL 和 mongodb 都不熟悉,我只是对 查找附近的人 这个东西感兴趣。
cevincheung
2015-01-20 01:07:20 +08:00
@zado
数据库中存储了1000w个point(经纬度坐标点,x,y 比如:113.846686,34.615693)。
指定一个point,比如112.846686,31.615693,获取这个点附近N公里内的所有点,需要将这个点与数据库中已有的所有点进行距离计算,然后按照距离排序,然后取出范围内的,最后返回。0.0019s已经很快了。


*关于mongodb,可能是我的配置有误(实际上我没做任何配置,启动命令:mongod --fork --dbpath /data/mongo --logpath /dev/null),按照对mongodb的理解,没理由这么慢。
ivanlw
2015-01-20 01:12:14 +08:00
最近两个月正在做这个,我有了解过你的解决方案,很不错!不过我们后来选择了ElasticSearch,它有内置的geo_point类型,所以直接可以用geo distance(你的搜索需求)或者polygon filter来搜。我们60million的数据,在地图画一个多边形,找出其中包含的所有点,不超过一秒,具体多少没看
zado
2015-01-20 01:13:38 +08:00
@cevincheung 谢谢,了解了。
cevincheung
2015-01-20 01:13:45 +08:00
@ivanlw
主要是不想用多套解决方案,比如库里更新一下,es更新一下,一个异常,pg没更新,es反倒更新成功了……担心这个
iloahz
2015-01-20 01:23:32 +08:00
@cevincheung 如果真是这样算的,实在没法想象1000w的规模跑0.0019s。。。
omegaga
2015-01-20 08:26:30 +08:00
@iloahz 如果他本身做了一些预处理,比如分块之类的,实际上的数据规模不一定是1000w
cevincheung
2015-01-20 08:41:52 +08:00
@iloahz yeah
cevincheung
2015-01-20 09:05:37 +08:00
@omegaga
欢迎一起分析
ivyshark
2015-01-20 10:33:36 +08:00
我们一开始也是用的mongo很慢 后来也用postgis很专业 现在已经转向elasticsearch了
cevincheung
2015-01-20 10:52:36 +08:00
@ivyshark
我也去看看es哈哈。如果对距离不敏感其实geohash也是个不错的方案。
SG0606
2015-09-13 13:08:42 +08:00
用 PostGIS2.1.7 和 Mongo 3.0.6 测试结果来看 Mongo 的性能大概是 PostGIS 的两倍~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/163607

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX