首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >postgresql:分层树的实现

postgresql:分层树的实现
EN

Stack Overflow用户
提问于 2013-04-24 00:49:19
回答 1查看 753关注 0票数 0

我一直在为1000+标记的标记聚类问题而苦苦挣扎(这应该放在谷歌地图上)。我不是很热衷于用所有的标记来呈现大型的JSON结构,我也不喜欢使用PostGIS的一些复杂的服务器“地理”-computations。

我想出的解决方案是将世界地图分成某种层次的空间树,比如quad tree,我的数据库中的每个点都将被分配到该树中的“坐标”。这些坐标是具有on position_x index_of_tile in tier_x的字符串,例如'031232320012‘。字符串的长度取决于将为前端地图启用的缩放级别的数量。基本上,如果用户移动或缩放地图,我将使用当前缩放级别和视图端口坐标作为参数启动Ajax GET请求。然后在后端,我计划构建一个字符串,它应该指向“给定缩放级别的视口”,例如'02113‘,并且我希望在树坐标列中找到具有该前缀('02113')的所有点。

编辑:我还需要快速分组方式,例如SELECT count(*) from points GROUP BY left(coordinates, 5);

我的问题是如何尽可能快地执行这些操作?我的数据库是PostgreSQL。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-24 01:05:22

然后在后端,我计划构建一个字符串,该字符串应该指向“给定缩放级别的视口”,例如'02113‘,并且我希望在树坐标列中找到具有此前缀('02113')的所有点。

只要在索引列中查看字符串的最左边的五个(或六个或七个)字符,普通索引在任何现代dbms上都应该表现良好。

代码语言:javascript
运行
复制
SELECT ...
...
WHERE column_name LIKE '02113%';

在PostgreSQL中,您还可以构建index on an expression。因此,您可以在前五个字符上创建索引。

代码语言:javascript
运行
复制
CREATE INDEX your_index_name ON your_table (left(column_name, 5));

如果有三到四个这样的索引,我希望PostgreSQL的查询优化器选择正确的索引。(一个用于5个字符,一个用于6个字符,依此类推)

我构建了一个表,并在其中填充了一百万行随机数据。

在下面的查询中,PostgreSQL的查询优化器确实选择了正确的索引。

代码语言:javascript
运行
复制
explain analyze
select s
from coords
where left(s, 5) ='12345';

它在0.1ms内返回。

我还使用GROUP BY进行了测试。同样,PostgreSQL的查询优化器选择了正确的索引。

代码语言:javascript
运行
复制
"GroupAggregate  (cost=0.00..62783.15 rows=899423 width=8) (actual time=91.300..3096.788 rows=90 loops=1)"
"  ->  Index Scan using coords_left_idx1 on coords  (cost=0.00..46540.36 rows=1000000 width=8) (actual time=0.051..2915.265 rows=1000000 loops=1)"
"Total runtime: 3096.914 ms"

GROUP BY子句中类似left(name, 2)的表达式将要求PostgreSQL接触索引中的每一行(如果不是表中的每一行)。这就是我的查询耗时3096ms的原因;它必须触及索引中的一百万行。但是您可以从EXPLAIN计划中看到它使用了索引。

通常,我希望地理应用程序对PostGIS表使用边界框来减少您访问的行数。如果您的四叉树实现不能做得更好,我会坚持使用PostGIS足够长的时间来成为它的专家。(除非您花了一些时间,否则您不会确定它不能完成工作。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16174892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档