我有大量的数据,我想稍后用于用户搜索。目前我有 2 亿资源(~50GB)。对于每个,我都有纬度+经度。目标是创建空间索引以便能够对其进行空间查询。因此,计划是使用 PostgreSQL + PostGIS。
我的数据在 CSV 文件中。我尝试使用自定义函数不插入重复项,但经过几天的处理我放弃了。我找到了一种在数据库中快速加载它的方法:使用 COPY 只需不到 2 小时。
然后,我需要在几何格式上转换纬度+经度。为此,我只需要这样做:
ST_SetSRID(ST_MakePoint(longi::double precision,lat::double precision),4326))
经过一番检查,我看到2亿,我有5000万点。所以,我认为最好的方法是拥有一个存储所有点的表“TABLE_POINTS”和一个存储带有point_key的资源的表“TABLE_RESOURCES”。
所以我需要从临时表“TABLE_TEMP”中填写“TABLE_POINTS”和“TABLE_RESOURCES”,并且不保留重复项。
对于“点”,我做了:
INSERT INTO TABLE_POINTS (point)
SELECT DISTINCT ST_SetSRID(ST_MakePoint(longi::double precision,lat::double precision),4326))
FROM TABLE_RESOURCES
我不记得花了多少时间,但我认为这是几个小时的问题。
然后,为了填写“资源”,我尝试了:
INSERT INTO TABLE_RESOURCES (...,point_key)
SELECT DISTINCT ...,point_key
FROM TABLE_TEMP, TABLE_POINTS
WHERE ST_SetSRID(ST_MakePoint(longi::double precision,lat::double precision),4326) = point;
但是又需要几天时间,并且无法查看查询的距离...
还有一点很重要,资源的数量会不断增长,目前应该每天增加100K,所以应该优化存储以保持对数据的快速访问。
因此,如果您对存储的加载或优化有任何想法,欢迎您。