Leaflet geoJson 和 Mysql,如何优化极慢的查询

问题描述 投票:0回答:1

我需要创建一个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 秒...我尝试解释分析,但似乎没有问题,也是因为所有字段都已索引:

analyze and explain results

我一直使用 Postgresql,我发现它在处理地理数据时更加强大,但在这种情况下我必须使用 Mysql,所以我问是否有一种更智能的方法来优化查询以获取地理数据的集合geoJson 将通过 Leaflet 进行管理

mysql leaflet geojson
1个回答
0
投票

“所有字段都已索引”——这通常是一个坏兆头。了解“复合”索引。

第一个查询可以重写为

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;

这可能会在遍历几何图形之前进行分组和分组。

© www.soinside.com 2019 - 2024. All rights reserved.