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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

标签

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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
3月前
|
存储 关系型数据库 MySQL
提高查询性能的秘密:深入剖析聚集、辅助、覆盖和联合索引
提高查询性能的秘密:深入剖析聚集、辅助、覆盖和联合索引
|
6月前
|
存储 程序员 C语言
c++ 如何做出实现一组数据的实际索引
c++ 如何做出实现一组数据的实际索引
|
10月前
|
存储 程序员 C语言
c++ 如何做出实现一组数据的实际索引
C++是一种计算机高级程序设计语言, 由​​C语言​​​扩展升级而产生 , 最早于1979年由​​本贾尼·斯特劳斯特卢普​​在AT&T贝尔工
|
SQL 存储 缓存
索引不是越多越好,理解索引结构原理,才有助于我们建立合适的索引!
MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引。
586 0
419. 甲板上的战舰 : 几种「扫描限制」&「空间限制」做法
419. 甲板上的战舰 : 几种「扫描限制」&「空间限制」做法
|
关系型数据库 PostgreSQL 索引
PostgreSQL 多维空间几何对象 相交、包含 高效率检索实践 - cube
标签 PostgreSQL , cube , 空间 , 几何 , 相交 , 包含 背景 多维空间对象的几何运算,高效率检索实践。 例如我们在数据库中存储了多维几何对象,可以使用lower, upper的数组来表达,例如3维度对象: CUBE [ xmin1 ymin1 zmin1 , xmax1 ymax1 zmax1 ] 在介绍CUBE类型前,我们可以使用6个字段(xmin,xmax,ymin,ymax,zmin,zmax)来表达一个立方体。
1064 0
|
SQL Oracle 关系型数据库
探索索引的奥秘 - 索引的属性
索引是一种奇特的对象,他就像一把双刃剑,用好了可以提高性能,用不好就可能会影响性能,但如何才能用好索引? 可能我们日常工作中,同事、朋友,甚至我自己会问这种问题, 我们创建了索引,为什么这条SQL未用这索引? 创建的索引越多,应用是不是就会越快?...
1592 0