我需要创建一个geoJson多边形图层,数据位于mysql数据库中,它指的是一个国家的区域。具体来说,我需要计算每个区域中的对象数量。我的地图根据发现的文物数量显示了不同颜色的区域,有点像死尸。 这些对象位于具有区域表外键的表中。 Web 应用程序和数据库位于不同的服务器上,这肯定会降低性能
我尝试了这样的查询:
select c.name, st_asgeojson(c.geom) geometry, count(a.*) tot
from county c
inner join artifact a on a.county = c.id
group by c.name
查询给了我一个错误,因为我没有在分组依据中输入几何图形,但是如果我也按几何分组,数据库就会“内存不足”。 我使用“with”结构重写了查询:
with
props AS (select county, count(*) tot from artifact group by county),
geom as (select id, name, st_asgeojson(geom) geometry from county)
select geom.id, geom.name, geom.geometry, props.tot
from props
inner join geom on props.county = geom.id;
它可以工作,但速度非常慢,大约十个多边形几乎需要 10 秒...我尝试解释分析,但似乎没有问题,也是因为所有字段都已索引:
我一直使用 Postgresql,我发现它在处理地理数据时更加强大,但在这种情况下我必须使用 Mysql,所以我问是否有一种更智能的方法来优化查询以获取地理数据的集合geoJson 将通过 Leaflet 进行管理
“所有字段都已索引”——这通常是一个坏兆头。了解“复合”索引。
第一个查询可以重写为
select c.name,
st_asgeojson(c.geom) AS 'geometry',
( SELECT count(*) FROM artifact
WHERE county = c.id ) AS tot
from county c;
这样可能会运行得更快并避免内存问题。尝试一下。
还有另一种方法:
SELECT c.name,
st_asgeojson(c.geom) AS 'geometry',
a.tot
FROM ( SELECT county, COUNT(*) AS tot
FROM artifact
GROUP BY county ) AS a
JOIN county AS c ON a.county = c.id;
这可能会在遍历几何图形之前进行分组和分组。