关于PostgreSQL的GiST索引之一

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: GiST索引是PostgreSQL中很神奇的一个东西,通过它有时可以轻松玩转多维数据。但是,在不恰当的使用场景下,它的性能表现也可能令人困惑。 1.概述 1.1 GiST为何物 GiST 的意思是通用的搜索树(Generalized Search Tree)。
GiST索引是PostgreSQL中很神奇的一个东西,通过它有时可以轻松玩转多维数据。但是,在不恰当的使用场景下,它的性能表现也可能令人困惑。

1.概述

1.1 GiST为何物

GiST 的意思是通用的搜索树(Generalized Search Tree)。 它是一种平衡的,树状结构的访问方法,在系统中起一个基础模版 的作用,可以使用它实现任意索引模式。B+-trees,R-trees 和许多其它的索引模式都可以用 GiST实现。

要深入研究GiST的话可参考下面的资料:
1)Marcel Kornacker 的论文,Access Methods for Next-Generation Database Systems:http://citeseer.nj.nec.com/448594.html,或PPT版http://www.doc88.com/p-9943363705540.html
2)Gist维护网站:http://www.sai.msu.su/~megera/postgres/gist/

1.2 如何实现一个GiST索引

GiST自身只是一个框架,针对不同的数据类型和算法逻辑需要额外实现特定的数据语义。由于GiST屏蔽了数据库的内部工作机制,比如锁的机制和预写日志。所以实现新的GiST索引实例(或称作索引操作符类)的工作相对比较轻松,基于GiST架构的索引操作符类只需提供下面7个方法的实现 (第8个方法是可选的)

consistent
给出一个在树的数据页上的谓词 p,和一个用户查询 q, 如果对于一个给定的数据项,p 和 q 都很明确地不能为真,那么这个方法将返回假。

union
这个方法合并树中的信息。给出一个条目的集合,这个函数生成一个新的谓词, 这个谓词对所有这些条目都为真。

compress
将数据项转换成一个适合于在一个索引页里面物理存储的格式。

decompress
compress 方法的反方法。把一个数据项的索引表现形式 转换成可以由数据库操作的格式。

penalty
返回一个表示将新条目插入树中特定分支需要的"开销"的数值。 项将会按照树中最小 penalty 的路径插下去。

picksplit
如果需要分裂一个页面的时候,这个函数决定页面中哪些条目保存呆旧页面里, 而哪些移动到新页面里。

same
如果两个条目相同,返回真,否则返回假。

详细参考PG手册:http://58.58.27.50:8079/doc/html/9.3.1_zh/gist.html

1.3 GiST索引的效率

谈到GiST索引的效率,关键还是看索引操作符类使用的索引算法。理解了索引算法也就大致可以了解某个数据类型在某个应用场景下是否适合创建GiST索引。这不像Gin索引,Gin索引的 基本算法固定 倒排索引。目前PostgreSQL内置的GiST索引操作符类,主要使用了下面这些索引算法。

B-tree
 适用于可比较大小的一维数据类型。由btree_gist模块提供,针对一些数据类型的B-tree等价功能。比如索引操作符类gist_int4_ops。不知道这个 btree_gist 模块存在的价值是否仅仅作为如何实现gist索引操作符类的一个示例,因为对一维数据直接用原生的btree索引就可以了。

R-Tree
  适用于在每个单维度上可进行大小比较 多维数据类型。几种几何数据类型的GiST实现就是用的R-Tree算法。比如point,box。另外还有范围类型等也是R-Tree的算法。关于R-Tree的原理,资料很多,就不多说了。


RD-tree
 RD-tree可用于集合数据类型的索引,intarray模块提供了int4值的一维数组的RD-Tree索引实现
 关于RD-tree的原理,看这张图就可以明白了。

参考:
http://wenku.baidu.com/link?url=thyllFOiO67gpI_19mY9bJ2LnU6KY2XeTV3OAqRHGlI_LvVgfoHyu59zXhFoycQFtBk8377y52fUeYjIruFUfYsf9yE0iDvhkUsDCA2n82S


签名文件索引(Signature File Index)
RD-Tree作为集合索引,在 索引 项目包含的元素很多时其key的大小会急剧膨胀。因此PostgreSQL中的一些GiST操作符类实现中,使用签名的方法对 索引 项目的key进行了压缩。看其实现方法,和 签名文件索引很像,不妨先叫它签名文件索引也许应该叫另外的名字)。tsvector(以及tsquery),hstore,pg_trgm等很多重要的集合数据类型都是用的这个作为GiST索引算法。

以下是通用的 签名文件索引的简单介绍。
http://book.51cto.com/art/200906/128323.htm
--------------------------------------------- ---------------------------------------------
1.存储阶段

对于每个关键字,分配一个固定大小的向量(k-bit),这个向量叫做签名(Signature);对于一个网页文件,经过词典切分后,形成由对应关键字序列构成的向量,即P=,对这些关键字的签名做OR运算,就形成了网页文件的签名。这个过程也被称为重叠编码(Superimposed Coding),然后把网页文件的签名结果依次存入一个个独立的文件中,形成对应的签名文件,这样形成的签名文件比原文件小很多。

例如:有一页网页分词后有这样一些关键字“文本”、“英语”、“单词”、“信件”,假设将这些关键字经某哈希表散列成固定位的数字向量(以6位为例),分别为hash(文本)=000110,hash(英语)= 110001,hash(单词)= 001101,hash(信件)=000111,这些数字向量即为关键字的签名,然后将这些签名做OR运算,得到网页文件的签名。

2.查询阶段

接受用户查询语句A,首先把用户查询串字符串切分成关键字序列,形成查询向量,即A=。然后把关键字映射成相应的向量签名,再与网页签名文件进行按位与运算,得到最后的匹配结果。
------------------------------------------------------------------------------------------





相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
4天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
38 9
|
1月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
2月前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
2月前
|
SQL 关系型数据库 MySQL
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
182 0
案例剖析:MySQL唯一索引并发插入导致死锁!
|
8天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
49 18
|
1天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
23 8
|
7天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
17 7
|
6天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
27 5
|
10天前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
59 7
|
26天前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
25 2
下一篇
DataWorks