gin索引 btree索引 gist索引比较

创建例子数据

postgres=# create table t_hash as select id,md5(id::text) from generate_series(1,5000000) as id; 
SELECT 5000000postgres=# vacuum ANALYZE t_hash;
VACUUMpostgres=# \timing
Timing is on.  postgres=# select * from t_hash limit 10;id |               md5                
----+----------------------------------1 | c4ca4238a0b923820dcc509a6f75849b2 | c81e728d9d4c2f636f067f89cc14862c3 | eccbc87e4b5ce2fe28308fd9f2a7baf34 | a87ff679a2f3e71d9181a67b7542122c5 | e4da3b7fbbce2345d7772b0674a318d56 | 1679091c5a880faf6fb5e6087eb1b2dc7 | 8f14e45fceea167a5a36dedd4bea25438 | c9f0f895fb98ab9159f51fd0297e236d9 | 45c48cce2e2d7fbdea1afc51c7c6ad2610 | d3d9446802a44259755d38e6d163e820
(10 rows)Time: 1.430 mspostgres=# explain analyze select * from t_hash where md5 like '%923820dc%';QUERY PLAN                                                        
--------------------------------------------------------------------------------------------------------------------------Gather  (cost=1000.00..68758.88 rows=500 width=37) (actual time=1.998..753.217 rows=1 loops=1)Workers Planned: 2Workers Launched: 2->  Parallel Seq Scan on t_hash  (cost=0.00..67708.88 rows=208 width=37) (actual time=492.740..742.780 rows=0 loops=3)Filter: (md5 ~~ '%923820dc%'::text)Rows Removed by Filter: 1666666Planning Time: 0.115 msExecution Time: 753.275 ms
(8 rows)Time: 754.916 ms

安装插件pg_trgm

postgres=# create extension pg_trgm ;
CREATE EXTENSIONpostgres=# select show_trgm('c4ca4238a0b923820dcc509a6f75849b');show_trgm 
-----------------------------------------------------------------------------------------------------------------------------------------{"  c"," c4",09a,0b9,0dc,20d,238,382,38a,423,49b,4ca,509,584,6f7,758,820,849,8a0,923,9a6,"9b ",a0b,a42,a6f,b92,c4c,c50,ca4,cc5,dcc,f75}
(1 row)Time: 12.006 ms

创建gin索引 like操作

#创建gin索引
postgres=# create index idx_gin on t_hash using gin(md5 gin_trgm_ops);
CREATE INDEX
Time: 177973.977 ms (02:57.974)
postgres=# explain analyze select * from t_hash where md5 like '%ce2345d%';QUERY PLAN                                                      QUERY PLAN                                                     
--------------------------------------------------------------------------------------------------------------------Bitmap Heap Scan on t_hash  (cost=239.87..2074.79 rows=500 width=37) (actual time=9.299..9.358 rows=2 loops=1)Recheck Cond: (md5 ~~ '%ce2345d%'::text)Heap Blocks: exact=2->  Bitmap Index Scan on idx_gin  (cost=0.00..239.75 rows=500 width=0) (actual time=9.256..9.258 rows=2 loops=1)Index Cond: (md5 ~~ '%ce2345d%'::text)Planning Time: 0.710 msExecution Time: 9.394 ms
(7 rows)

gin索引问题

postgres=# explain analyze select * from t_hash where md5 like '%9b%';QUERY PLAN                                                     
-------------------------------------------------------------------------------------------------------------------Seq Scan on t_hash  (cost=0.00..104167.00 rows=808081 width=37) (actual time=0.035..6246.231 rows=574238 loops=1)Filter: (md5 ~~ '%9b%'::text)Rows Removed by Filter: 4425762Planning Time: 6.721 msExecution Time: 9816.262 ms

如果碰到Like 小于两个字符的时候,无法使用gin索引。比如like '%ab%'无法使用索引。但是如果‘%abc%’就可以使用索引。

创建gist索引 like操作

postgres=# CREATE INDEX idx_gist ON t_hash USING gist (md5 gist_trgm_ops);
CREATE INDEX
postgres=# drop index idx_gin;
DROP INDEX
postgres=# DISCARD all;
DISCARD ALL
postgres=# explain analyze select * from t_hash where md5 like '%ce2345d%';QUERY PLAN                                                       
------------------------------------------------------------------------------------------------------------------------Bitmap Heap Scan on t_hash  (cost=52.29..1887.21 rows=500 width=37) (actual time=808.728..808.738 rows=2 loops=1)Recheck Cond: (md5 ~~ '%ce2345d%'::text)Heap Blocks: exact=2->  Bitmap Index Scan on idx_gist  (cost=0.00..52.16 rows=500 width=0) (actual time=808.707..808.708 rows=2 loops=1)Index Cond: (md5 ~~ '%ce2345d%'::text)Planning Time: 0.220 msExecution Time: 808.855 ms
(7 rows)

测试发现,上述测试条件下,gin的效率要高很多。
对于上面gin索引两个字符无法使索引的问题,gist可以使用索引。

索引之=比拼

#gist索引情况
postgres=# explain analyze select * from t_hash where md5 ='1679091c5a880faf6fb5e6087eb1b2dc';QUERY PLAN                                                     
--------------------------------------------------------------------------------------------------------------------Index Scan using idx_gist on t_hash  (cost=0.41..8.43 rows=1 width=37) (actual time=36.534..77.858 rows=1 loops=1)Index Cond: (md5 = '1679091c5a880faf6fb5e6087eb1b2dc'::text)Planning Time: 0.117 msExecution Time: 77.885 ms
(4 rows) 
postgres=# drop index idx_gist;
DROP INDEX
postgres=# create index idx_gin on t_hash using gin(md5 gin_trgm_ops);
CREATE INDEX
postgres=# discard all;
DISCARD ALL#gin索引情况
postgres=# explain analyze select * from t_hash where md5 ='1679091c5a880faf6fb5e6087eb1b2dc';QUERY PLAN                                                      
---------------------------------------------------------------------------------------------------------------------Bitmap Heap Scan on t_hash  (cost=1560.01..1564.02 rows=1 width=37) (actual time=28.292..28.293 rows=1 loops=1)Recheck Cond: (md5 = '1679091c5a880faf6fb5e6087eb1b2dc'::text)Heap Blocks: exact=1->  Bitmap Index Scan on idx_gin  (cost=0.00..1560.01 rows=1 width=0) (actual time=28.275..28.276 rows=1 loops=1)Index Cond: (md5 = '1679091c5a880faf6fb5e6087eb1b2dc'::text)Planning Time: 0.374 msExecution Time: 28.323 ms
(7 rows)# btree索引情况
postgres=# create index idx_dx on t_hash(md5);
CREATE INDEXpostgres=# discard all;
DISCARD ALL
postgres=# explain analyze select * from t_hash where md5 ='1679091c5a880faf6fb5e6087eb1b2dc';QUERY PLAN                                                   
----------------------------------------------------------------------------------------------------------------Index Scan using idx_dx on t_hash  (cost=0.56..8.57 rows=1 width=37) (actual time=0.034..0.038 rows=1 loops=1)Index Cond: (md5 = '1679091c5a880faf6fb5e6087eb1b2dc'::text)Planning Time: 0.127 msExecution Time: 0.060 ms
(4 rows)测试情况:
gist:77.885 ms
gin:28.323 ms
btree:0.060 ms

测试结果:在=的测试中btree索引吊打。

索引大小比较


postgres=# select pg_size_pretty(pg_total_relation_size('idx_dx'));pg_size_pretty 
----------------282 MB
(1 row)postgres=# select pg_size_pretty(pg_total_relation_size('idx_gin'));pg_size_pretty 
----------------332 MBpostgres=# select pg_size_pretty(pg_total_relation_size('idx_gist'));pg_size_pretty 
----------------885 MB
(1 row)

结论:gist索引更大。

gin索引 VACUUM and autovacuum

首先gin索引的结构如下:
在这里插入图片描述

#创建表
postgres=# CREATE TABLE t_fti (payload tsvector) WITH (autovacuum_enabled = off);
CREATE TABLE
#插入数据
postgres=# INSERT INTO t_fti SELECT to_tsvector('english', md5('dummy' || id)) FROM generate_series(1, 2000000) AS id;
INSERT 0 2000000postgres=# select * from t_fti limit 5;payload                
--------------------------------------'8c2753548775b4161e531c323ea24c08':1'c0c40e7a94eea7e2c238b75273087710':1'ffdc12d8d601ae40f258acf3d6e7e1fb':1'abc5fc01b06bef661bbd671bde23aa39':1'20b70cebcb94b1c9ba30d17ab542a6dc':1
(5 rows)#创建索引
postgres=# CREATE INDEX idx_fti ON t_fti USING gin(payload);
CREATE INDEX#使用插件观察索引
postgres=# CREATE EXTENSION pgstattuple;
CREATE EXTENSION#首次没有pending list
postgres=# SELECT * FROM pgstatginindex('idx_fti');version | pending_pages | pending_tuples 
---------+---------------+----------------2 |             0 |              0
(1 row)#再次插入数据
postgres=# INSERT INTO t_fti
SELECT to_tsvector('english', md5('dummy' || id))
FROM generate_series(2000001, 3000000) AS id;
INSERT 0 1000000#pendling有数据,说明fastupate有效
postgres=# SELECT * FROM pgstatginindex('idx_fti');version | pending_pages | pending_tuples 
---------+---------------+----------------2 |           326 |          50141
(1 row)#vacuum后写入gin树中
postgres=# vacuum t_fti ;
VACUUM
postgres=# SELECT * FROM pgstatginindex('idx_fti');version | pending_pages | pending_tuples 
---------+---------------+----------------2 |             0 |              0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/193309.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机开机入网流程 KPI接通率和掉线率

今天我们来学习手机开机入网流程是怎么样的。以及RRC连接和重建流程(和博主之前讲TCP三次握手,四次挥手原理很相似)是什么样的,还有天线的KPI指标都包括什么,是不是很期待啊~ 目录 手机开机入网流程 ATTACH/RRC连接建立过程 KPI接通率和掉…

ubuntu 18.04安裝QT+PCL+VTK+Opencv

资源 qt5.14.1:qt5.14.1.run opencv4.5.5:opecv4.5.5压缩包 1.国内换中科大源,加快下载速度 cd /etc/apt/ sudo gedit sources.list 替换成如下内容 deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse deb-src https://mirro…

WordPress 媒体库文件夹管理插件 FileBird v5.5.4和谐版下载

FileBird是一款WordPress 按照文件夹管理方式的插件。 拖放界面 拖放功能现已成为现代软件和网站的标配。本机拖动事件(包括仅在刀片中将文件移动到文件夹以及将文件夹移动到文件夹)极大地减少了完成任务所需的点击次数。 一流设计的文件夹树展示 我们…

<MySQL> 查询数据进阶操作 -- 联合查询

目录 一、什么是笛卡尔积? 二、什么是联合查询? 三、内连接 3.1 简介 3.2 语法 3.3 更多的表 3.4 操作演示 四、外连接 4.1 简介 4.2 语法 4.3 操作演示 五、自连接 5.1 简介 5.2 自连接非必要不使用 六、子查询(嵌套查询) 6.1 简介 6.…

Docker Compose详细教程(从入门到放弃)

对于现代应用来说,大多都是通过很多的微服务互相协同组成的一个完整应用。例如, 订单管理、用户管理、品类管理、缓存服务、数据库服务等,它们构成了一个电商平台的应 用。而部署和管理大量的服务容器是一件非常繁琐的事情。而 Docker Compos…

arcgis--填充面域空洞

方法一:使用【编辑器】-【合并工具】进行填充。首选需要在相同图层中构造一个填充空洞的面域,然后利用【合并】工具进行最后填充。 打开一幅含有空洞的矢量数据,如下: 打开【开始编辑】-【构造工具】-【面】进行覆盖空洞的面域的…

RabbitMQ之交换机

文章目录 一、Exchanges1、Exchanges 概念2、Exchanges 的类型3、无名 exchange 二、临时队列三、绑定(bindings)四、Fanout(扇出)1、Fanout 介绍2、Fanout 实战 五、Direct exchange(直连交换机)1、Direct exchange 介绍2、多重绑…

相对强弱指标 RSI

SMA(A,B,1)MA AA ,一天前的收盘价; BB,如果时涨的,把涨幅返回; CC,12天的涨幅占12天全部涨跌幅的多少; 画一条50 的线条。

一道 python 数据分析的题目

python 数据分析的题目。 做题方法:使用 pandas 读取数据,然后分析。 知识点:pandas,正则表达式,py知识。 过程:不断使用 GPT,遇到有问题的地方自己分析,把分析的结果告诉 GPT&am…

vagrant+virtualbox的踩坑记录

vagrant virtualbox 文章目录 vagrant virtualbox一、导入虚拟机ova文件失败二、修改虚拟机的保存位置三、无法使用xshell等软件用密码进行连接四、vagrant up失败 一、导入虚拟机ova文件失败 背景:手动删除了虚拟机文件导致无法重新导入相同名称虚拟机的ova文件…

HTML5响应式网页设计(考试题:旅游项目)

效果图 .html代码 <!DOCTYPE html> <html><head><meta name"viewport"content"widthdevice-width,initial-scale1,minimum-scale1,maximum-scale1,user-scalableno" /><meta charset"utf-8" /><title></…

【Phoenix】请求的生命周期

本文的目的是讨论Phoenix请求的生命周期。我们实战添加两个新的页面&#xff0c;并讨论整个过程是如何串起来的。 让我们从添加第一个新页面开始。 添加一个新页面 web应用通常通过将HTTP方法和路径映射到应用的某个函数来处理请求。Phoenix通过路由器来实现这个匹配。例如将…

Debian/Ubuntu 安装 NodeJS【详细步骤】

文章目录 NodeSource 简介Debian/Ubuntu 安装 NodeJS第 1 步:进入 jenkins 容器第 2 步:下载和导入 NodeSource第 3 步:创建 deb 仓库第 4 步:安装 NodeJS第 5 步:卸载NodeJS参考👉 背景:在 Docker 中安装了 Jenkins,Jenkins 镜像为 Debian 11 bullseye。 👉 目标:…

5. HTML中常用标签

5. html常用标签 5.1 标签语义 学习标签是有技巧的&#xff0c;重点是记住每个标签的语义。简单理解就是指标签的含义。即这个标签是用来干嘛的。 根据标签的语义&#xff0c;在合适的地方给一个最为合理的标签。可以让页面结构给清晰。 5.2 标题标签 <h1>-<h6>…

openssl+sha256开发实例(C++)

文章目录 一、 sha256介绍二、sha256原理三、openssl sha256实现 一、 sha256介绍 SHA-256&#xff08;Secure Hash Algorithm 256-bit&#xff09;是一种哈希算法&#xff0c;属于 SHA-2&#xff08;Secure Hash Algorithm 2&#xff09;家族的一员。SHA-256 产生的哈希值是一…

HTTP1.1协议详解

目录 协议介绍协议的特点存在的问题协议优化方案与HTTP 1.0协议的区别 协议介绍 HTTP 1.1是一种基于文本的互联网实体信息交互协议&#xff0c;是Web上任何数据交换和客户端-服务器交互的基础。它允许获取各种类型的资源&#xff0c;如HTML文档&#xff0c;并支持在互联网上交…

嵌入式养成计划-53----ARM--串口通信

一百三十四、串口通信 134.1 串口的概念 串口&#xff08;UART&#xff09;&#xff1a;Universal asynchronous receiver transmitter (USART/UART)&#xff0c;通用异步接收发送器通过串口可以实现两个不同机器之间的信息交互串口通信属于总线通信的一种 134.2 总线的概念…

2023.11.16-hive sql高阶函数lateral view,与行转列,列转行

目录 0.lateral view简介 1.行转列 需求1: 需求2: 2.列转行 解题思路: 0.lateral view简介 hive函数 lateral view 主要功能是将原本汇总在一条&#xff08;行&#xff09;的数据拆分成多条&#xff08;行&#xff09;成虚拟表&#xff0c;再与原表进行笛卡尔积&#xff0c…

基于 Redis 实现的分布式锁

获取锁 互斥&#xff1a;确保只有一个线程获得锁 # 添加锁 利用setnx的互斥性 127.0.0.1:6379> setnx lock thread1释放锁 手动释放锁 超时释放&#xff1a;获取锁时设置一个超时时间 #释放锁 删除即可 127.0.0.1:6379> del lock两步合成一步 help setSET key value …

人工智能基础_机器学习037_多项式回归升维实战4_使用随机梯度下降模型_对天猫双十一销量数据进行预测_拟合---人工智能工作笔记0077

上一节我们使用线性回归模型最终拟合了双十一天猫销量数据,升维后的数据. 我们使用SGDRegressor的时候,随机梯度下降的时候,发现有问题, 对吧,怎么都不能拟合我们看看怎么回事现在 可以看到上面是之前的代码 上面是对数据的准备 这里我们还是修改,使用 poly=PolynomialFeatur…