BRIN: 区块索引

简介: 本文主要介绍 BRIN 索引, 其具有较小的存储开下和维护开销


BRIN 是一种新的索引扫描方式, 它可以加速扫描非常大的表,而没有必要像B-Tree等其他传统索引的维护开销。
它的工作方式是维护数据库范围的 "summary" 数据

位图扫描的工作机制是通过读取每一个 summary 元组和拿该元组与查询条件比较; 如果查询条件的值在summary中,
在有损耗的TID位图中,范围内的全部的页都将会返回。否则不会返回。传统的索引扫描并不会采用这种方式,因为其
根本不会去存储 TID。
一个新的记录插入到表中, BRIN索引会更新summary的信息(如果插入的记录在已经包含的数据块中, 那么这个元组
信息将会被统计在内)否则不会更新。在最后一种情况, 使用 VACUUM 或者 brin_summarize_new_values() 函数将会
创建 summary 信息。
对于具有1维排序顺序类型的数据, summary 信息会包含每个字段的最大值和最小值在page范围内, 这种类型符号的操
作称之为 "MinMax", B-tree opclass 支持多种数据类型。 由于 BRIN的普遍性, 它也适合诸如数组, 集合类型, 范围类型
; 甚至是 枚举类型, 我们也可以去考虑实现特殊的minmax 操作。

catalog 可能出现一些变化,将会有更多令人兴奋的功能实现, 向美好的方向前进。

感谢
Simon Riggs, Alvaro Herrera Heikki Linnakangas

下面的实验主要考虑一下内容

  1. 构建索引的时间花费
  2. 更新索引的时间花费
  3. 索引的大小
  4. 查询走索引的访问时间和 = 操作的时间
  5. 查询使用索引的访问时间和 between 操作的时间

实验准备
创建两个测试表


$ create table for_btree (id int8, payload text);

$ insert into for_btree (id, payload) select i, repeat('depesz', 100) from generate_series(1, 1000000) i;

$ create table for_brin (id int8, payload text);

$ insert into for_brin(id, payload) select i, repeat ('depesz', 100) from generate_series(1,1000000) i;

上述两个表的大小都是 650MB,

创建索引耗时对比实验


$ create index for_btree_id_idx on for_btree using btree (id);

$ create index for_brin_id_idx for_brin using brin (id);

更新索引的耗时对比实验


$ update for_btree set id = 1000000 + id where id < 300000;

$ update for_brin set id = 1000000 + id where id < 300000;

查看索引大小


$ /di+

查询耗时对比实验

  1. = 操作的耗时对比


$ select count(*) from for_btree where id = 654321::int8;

$ select count(*) from for_brin where id = 654321::int8;

$ select count(*) from for_btree where id between 600000::int8 and 650000::int8;

$ select count(*) from for_brin where id between 600000::int8 and 650000::int8;

从上述实验可以看出, 对于 = 操作也好, 还是 between and 操作也好, BRIN 索引的耗时都要比 BTREE 索引耗时多很多。

补充信息, BRIN 索引是可以配置的。 我们可以从下面这张表中中得出具体的配置。具体的实现是通过修改参数 pages_per_range
的存储参数来实现的。 值越小, 指数越大。 并可能执行更快,但是更新的耗时也随之增加

pages_per_range index size create time update time search (=) time search (between) time
10000 24 kB 369.234 ms 8567.034 ms 87.606 ms 154.182 ms
1000 24 kB 373.150 ms 8812.391 ms 96.339 ms 133.546 ms
100 40 kB 360.555 ms 8867.043 ms 98.941 ms 131.126 ms
10 296 kB 392.038 ms 8619.480 ms 99.834 ms 132.327 ms
1 2800 kB 629.255 ms 8600.095 ms 114.882 ms 147.765 ms

来源: https://www.depesz.com/2014/11/22/waiting-for-9-5-brin-block-range-indexes/
这里的问题是,该索引为何没有加快索引(搜索)的速度, 可能和数据的分布有很大关系。但是总的来说, 它使用了很小的索引
存储开销, 加快了一些查询。这还是很不错的。

https://www.depesz.com/2014/11/22/waiting-for-9-5-brin-block-range-indexes/

目录
相关文章
|
存储 Dubbo API
SpringCloud工程部署启动
本节笔者带领大家完成了SpringCloud工程从0->1的搭建,当然你不想搭建也可以直接采用方案一,二者等效,至此读者们完成了一个微服务工程的搭建、部署、访问。同时在本节最后一章,笔者基于RestTemplate发起的http请求实现远程调用,实现当A系统想要获取B系统数据时的跨系统数据交互。然而RESTful API访问并不是微服务的唯一解决方案,如Dubbo的交互一样可以实现,希望读者们能不限于此。
|
存储 安全 Java
Android DataStore:安全存储和轻松管理数据
Android DataStore:安全存储和轻松管理数据
|
12月前
|
数据采集 存储 数据管理
CDGA|数据治理:确保数据质量与价值的综合性框架
数据治理是一个系统工程,涉及数据战略、数据架构、数据质量、数据安全、数据合规性、数据生命周期管理以及数据资产管理等多个方面。通过全面、系统地实施数据治理策略,可以确保数据资产的有效利用和价值的最大化。在数字化时代,数据治理已成为企业实现数字战略的基础和保障。
|
存储 计算机视觉 Python
NumPy 在图像处理中的应用
【8月更文第30天】NumPy 是 Python 中用于科学计算的核心库之一,它提供了高效的数组操作功能。在图像处理领域,NumPy 的数组结构非常适合存储和操作图像数据。本文将详细介绍如何使用 NumPy 进行图像处理,包括加载图像、显示图像、像素操作、颜色空间转换和简单的滤波器应用等。
505 0
|
机器学习/深度学习 算法 Python
探索Python中的基础算法:梯度提升机(GBM)
探索Python中的基础算法:梯度提升机(GBM)
631 2
|
人工智能 自然语言处理 搜索推荐
如何利用AI技术改善学生的学习体验?
【5月更文挑战第19天】如何利用AI技术改善学生的学习体验?
524 1
|
数据采集 编解码 JSON
使用Python进行网站数据爬取和视频处理
在互联网时代,我们经常需要从网站上获取数据并进行分析或处理。有时候,我们还需要对视频数据进行一些操作,比如剪辑、转码、合成等。Python是一门非常适合做数据分析和视频处理的编程语言,它有很多强大的库和工具可以帮助我们完成这些任务。本文将介绍如何使用Python的requests模块爬取网站数据并进行视频处理的方法和步骤。
474 0
使用Python进行网站数据爬取和视频处理
|
分布式计算 MaxCompute
Dataphin试用操作步骤
Dataphin, 试用, 操作步骤
1283 0
Dataphin试用操作步骤
|
人工智能 算法 搜索推荐
颠覆传统RPA的实在IPA模式,如何做到真正人人可用
为什么实在智能能够率先发布一款颠覆传统RPA的IPA模式产品?CEO孙林君告诉我们答案。
481 0
颠覆传统RPA的实在IPA模式,如何做到真正人人可用
|
人工智能 物联网 云计算
Gartner发布了最新全球物联网竞争报告,阿里云等10家企业最具竞争力
近日,知名调研机构Gartner发布最新全球物联网平台竞争格局报告,阿里云入选全球最具竞争力的10家企业之一。可以说,全球物联网市场格局延续了云计算3A(AWS、Azure 和阿里云)的鼎立之势
1069 1
Gartner发布了最新全球物联网竞争报告,阿里云等10家企业最具竞争力