透过空间角度 理解GiST索引的构造

简介:

标签

PostgreSQL , GIS , PostGIS , Greenplum , 空间检索 , GiST , B-Tree , geohash


背景

可以支持空间检索的GiST索引的数据结果到底是什么样的呢?

本文为以下两篇文档的增补:

《Greenplum 空间(GIS)数据检索 B-Tree & GiST 索引实践 - 阿里云HybridDB for PostgreSQL最佳实践》

《PostGIS空间索引(GiST、BRIN、R-Tree)选择、优化 - 阿里云RDS PostgreSQL最佳实践》

GiST索引的构造

我们可以用空间的思想来理解它,比如我在这篇文档中讲解了为什么我们需要通过数据规整来提高geohash b-tree的检索效率。

《Greenplum 空间(GIS)数据检索 B-Tree & GiST 索引实践 - 阿里云HybridDB for PostgreSQL最佳实践》

因为这样可以让每个heap block的bound box(包含这个HEAP BLOCK中所有空间的最小BOX, 平面对象。如果是多维对象,使用多维对象的立体BOX或者多维BOX表示。)尽量的缩小,同时让不同heap block之间的边界更加的清晰,重叠少。从而提高空间数据检索的过滤性。

实际上GiST索引思想与之类似,只不过它不是通过编排HEAP BLOCK来实现这一的划清边界的,而是通过R-Tree结构来表示的。这一的话,用户在写入数据时,对应的空间对象写到哪个GiST索引分支就非常的明朗。(当然,GiST索引和其他索引一样,随着数据的写入会出现SPLIT的需求。)

pic

GiST索引对写入性能的影响(时间越小越好)

postgres=# create unlogged table test_gist (pos geometry);  
CREATE TABLE  
  
postgres=# create index idx_test_gist_1 on test_gist using gist (pos);  
CREATE INDEX  
  
postgres=# insert into test_gist select st_setsrid(st_makepoint(random()*360-180, random()*180-90), 4326) from generate_series(1,5000000);  
INSERT 0 5000000  
Time: 67127.758 ms  
  
postgres=# drop index idx_test_gist_1 ;  
DROP INDEX  
Time: 1056.465 ms  
  
postgres=# create index idx_test_gist_1 on test_gist using gist (pos);  
CREATE INDEX  
Time: 58945.677 ms  

B-Tree索引对写入的性能影响(时间越小越好)

postgres=# create unlogged table test_btree (pos geometry);  
CREATE TABLE  
  
postgres=# create index idx_test_btree_1 on test_btree using btree(st_geohash(pos,11));  
CREATE INDEX  
  
postgres=# insert into test_btree select st_setsrid(st_makepoint(random()*360-180, random()*180-90), 4326) from generate_series(1,5000000);  
INSERT 0 5000000  
Time: 30199.098 ms  
  
postgres=# drop index idx_test_btree_1 ;  
DROP INDEX  
Time: 50.565 ms  
  
postgres=# create index idx_test_btree_1 on test_btree using btree(st_geohash(pos,11));  
CREATE INDEX  
Time: 7746.942 ms  

BRIN索引对写入性能的影响(时间越小越好)

postgres=# create unlogged table test_brin (pos geometry);  
CREATE TABLE  
  
postgres=# create index idx_test_brin_1 on test_brin using brin(pos);  
CREATE INDEX  
  
postgres=# insert into test_brin select st_setsrid(st_makepoint(random()*360-180, random()*180-90), 4326) from generate_series(1,5000000);  
INSERT 0 5000000  
Time: 7476.996 ms  
  
postgres=# drop index idx_test_brin_1 ;  
DROP INDEX  
Time: 1.604 ms  
  
postgres=# create index idx_test_brin_1 on test_brin using brin(pos);  
CREATE INDEX  
Time: 1697.741 ms  

GiST实际上是一个通用的索引框架,支持多种数据类型

不仅仅空间类型,更多复杂的类型GiST或者SP-GiST索引也支持。

pic

小结

GiST直接构建在空间列上,对性能影响最大。

Btree直接构建在空间列上,使用表达式(st_geohash)构建btree索引,对性能影响较小。

BRIN直接构建在空间列上,对性能影响最小。

参考

《Greenplum 空间(GIS)数据检索 B-Tree & GiST 索引实践 - 阿里云HybridDB for PostgreSQL最佳实践》

《PostGIS空间索引(GiST、BRIN、R-Tree)选择、优化 - 阿里云RDS PostgreSQL最佳实践》

Flexible Indexing with Postgres

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
存储 自然语言处理 Oracle
打造全球化企业:ERP系统的国际化与多语言支持
打造全球化企业:ERP系统的国际化与多语言支持
1071 2
|
SQL 监控 关系型数据库
MySQL 延迟从库介绍
本文介绍了MySQL中的延迟从库功能,详细解释了其工作原理及配置方法。延迟从库允许从库在主库执行完数据变更后延迟一段时间再同步,主要用于快速恢复误操作的数据。此外,它还可用于备份、离线查询及数据合规性需求。通过合理配置,可显著提升数据库系统的稳定性和可靠性。
444 4
|
8月前
|
数据采集 JavaScript 前端开发
浏览器自动化检测对抗:修改navigator.webdriver属性的底层实现
本文介绍了如何构建一个反检测爬虫以爬取Amazon商品信息。通过使用`undetected-chromedriver`规避自动化检测,修改`navigator.webdriver`属性隐藏痕迹,并结合代理、Cookie和User-Agent技术,实现稳定的数据采集。代码包含浏览器配置、无痕设置、关键词搜索及数据提取等功能,同时提供常见问题解决方法,助你高效应对反爬策略。
745 1
|
设计模式 前端开发 C#
使用 Prism 框架实现导航.NET 6.0 + WPF
使用 Prism 框架实现导航.NET 6.0 + WPF
504 10
|
网络安全 数据安全/隐私保护
堡垒机上的主机连接本地sftp报错链接被意外关闭
【10月更文挑战第3天】堡垒机上的主机连接本地sftp报错链接被意外关闭
770 1
|
XML 搜索推荐 数据格式
资源描述框架的用途及实际应用解析
**RDF(资源描述框架)**是一种用于机器理解网络资源的框架,使用XML编写。它通过URI标识资源,用属性描述资源,便于计算机应用程序处理信息。RDF在语义网上促进信息的确切含义和自动处理,使得网络信息可被整合。RDF语句由资源、属性和属性值组成。RDF文档包括`<rdf:RDF>`根元素和`<rdf:Description>`元素,后者用`about`属性标识资源。RDF还支持容器(如`<Bag>`、`<Seq>`和`<Alt>`)来描述集合。RDFS是RDF的扩展,提供描述类和属性的框架,而达布林核心是一组预定义属性,用于描述文
473 0
|
编解码 Java Nacos
nacos常见问题之密码加密配置如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
1978 0
|
机器学习/深度学习 数据采集 搜索推荐
机器学习在生物信息学中的应用
机器学习在生物信息学中的应用正迅速改变着生物学研究的面貌。通过在基因组学、蛋白质结构预测、药物研发、癌症诊断等领域的应用,机器学习为生物信息学带来了新的机遇和挑战。然而,我们也要认识到在处理数据质量、可解释性和数据隐私等方面可能面临的困难。未来,随着技术的不断进步,机器学习将在生物信息学领域持续发挥重要作用,为生命科学研究带来更多的创新和突破。
1089 1
|
JavaScript Java 中间件
可观测性之Micrometer Tracing
益复杂的软件架构导致系统在出现问题的时候,发现问题和排查问题的效率极低。那这个问题如何解决呢?就需要引入一个称为链路追踪的系统。
1379 1
可观测性之Micrometer Tracing
|
并行计算 关系型数据库 数据库