V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cevincheung
V2EX  ›  PostgreSQL

PostgreSQL & PostGIS 附近的人

  •  
  •   cevincheung · 2015-01-19 20:58:17 +08:00 · 11241 次点击
    这是一个创建于 3600 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
    
    第 1 条附言  ·  2015-01-20 01:12:19 +08:00
    别忘了添加GiST索引
    第 2 条附言  ·  2015-01-20 10:53:02 +08:00
    21 条回复    2016-01-13 01:37:00 +08:00
    mywaiting
        1
    mywaiting  
       2015-01-19 21:21:54 +08:00
    GIS这个对于pg来说,是个挺好的实现。传闻中instagram就是因为这个而选择了pg
    pichina
        2
    pichina  
       2015-01-19 23:13:57 +08:00
    1000w数据是随机生成的么?
    markyangd
        3
    markyangd  
       2015-01-19 23:43:34 +08:00
    gis专业的低头走过
    cevincheung
        4
    cevincheung  
    OP
       2015-01-19 23:54:54 +08:00
    @pichina Google地图POI数据
    cevincheung
        5
    cevincheung  
    OP
       2015-01-19 23:55:37 +08:00
    @markyangd 学校里会教postgresql么?
    cevincheung
        6
    cevincheung  
    OP
       2015-01-19 23:56:04 +08:00
    @mywaiting 又收集了一个案例,居然不知道instagram用pg……(捂脸)
    zado
        7
    zado  
       2015-01-20 00:20:28 +08:00
    请问 "1000w数据排序检索耗时0.0019s " 是个什么概念?
    就是有1000万个坐标数据,查找出某一个坐标相邻的 10个坐标需用时 0.0019秒 的意思吗?也就是大概每秒钟能查找500次的样子对吗?
    cevincheung
        8
    cevincheung  
    OP
       2015-01-20 00:41:49 +08:00
    @zado
    不知道你咋算的。默认配置mongodb需要3s
    zado
        9
    zado  
       2015-01-20 01:00:31 +08:00
    @cevincheung 1秒 除以 0.0019秒 等于 526.32次 ,我是这样算的。
    “默认配置mongodb需要3s” mongodb需要3s才能查询到1个结果吗?
    很抱歉,我对PostgreSQL 和 mongodb 都不熟悉,我只是对 查找附近的人 这个东西感兴趣。
    cevincheung
        10
    cevincheung  
    OP
       2015-01-20 01:07:20 +08:00   ❤️ 1
    @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
        11
    ivanlw  
       2015-01-20 01:12:14 +08:00 via iPhone
    最近两个月正在做这个,我有了解过你的解决方案,很不错!不过我们后来选择了ElasticSearch,它有内置的geo_point类型,所以直接可以用geo distance(你的搜索需求)或者polygon filter来搜。我们60million的数据,在地图画一个多边形,找出其中包含的所有点,不超过一秒,具体多少没看
    zado
        12
    zado  
       2015-01-20 01:13:38 +08:00
    @cevincheung 谢谢,了解了。
    cevincheung
        13
    cevincheung  
    OP
       2015-01-20 01:13:45 +08:00
    @ivanlw
    主要是不想用多套解决方案,比如库里更新一下,es更新一下,一个异常,pg没更新,es反倒更新成功了……担心这个
    iloahz
        14
    iloahz  
       2015-01-20 01:23:32 +08:00
    @cevincheung 如果真是这样算的,实在没法想象1000w的规模跑0.0019s。。。
    omegaga
        15
    omegaga  
       2015-01-20 08:26:30 +08:00 via Android
    @iloahz 如果他本身做了一些预处理,比如分块之类的,实际上的数据规模不一定是1000w
    cevincheung
        16
    cevincheung  
    OP
       2015-01-20 08:41:52 +08:00
    @iloahz yeah
    cevincheung
        17
    cevincheung  
    OP
       2015-01-20 09:05:37 +08:00
    @omegaga
    欢迎一起分析
    ivyshark
        18
    ivyshark  
       2015-01-20 10:33:36 +08:00
    我们一开始也是用的mongo很慢 后来也用postgis很专业 现在已经转向elasticsearch了
    cevincheung
        19
    cevincheung  
    OP
       2015-01-20 10:52:36 +08:00
    @ivyshark
    我也去看看es哈哈。如果对距离不敏感其实geohash也是个不错的方案。
    SG0606
        20
    SG0606  
       2015-09-13 13:08:42 +08:00
    用 PostGIS2.1.7 和 Mongo 3.0.6 测试结果来看 Mongo 的性能大概是 PostGIS 的两倍~
    cevincheung
        21
    cevincheung  
    OP
       2016-01-13 01:37:00 +08:00
    @SG0606 如果可以的话,能不能给出测试数据我测试一下,一直在研究这一块。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1739 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:40 · PVG 00:40 · LAX 08:40 · JFK 11:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.