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.hqwc.cn/news/175117.html

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

相关文章

VEX —— Half-edges

目录 一,概述 二,等效 三,函数 四,案例 Dual Mesh Mesh Subdividsion Mesh Bevel 在一些VEX函数,可将边看成为每个面非共享的半边; 一,概述 在houdini,边通常被视为面之间无方…

LLM App ≈ 数据ETL管线

虽然现有的 LLM 应用程序工具(例如 LangChain 和 LlamaIndex)对于构建 LLM 应用程序非常有用,但在初始实验之外不建议使用它们的数据加载功能。 当我构建和测试我的LLM应用程序管道时,我能够感受到一些尚未开发和破解的方面的痛苦…

微服务的注册发现和微服务架构下的负载均衡

文章目录 微服务注册模型服务注册与发现怎么保证高可用【1. 服务端崩溃检测】【2. 客户端容错】【3. 注册中心选型】 微服务架构下的负载均衡【1.轮询与加权轮询】【2.随机与加权随机】【3.哈希与一致性哈希】【4.最少连接数】【5.最少活跃数】【6.最快响应时间】【总结】 负载…

DNA甲基化的相关知识

目录 1. DNA甲基化简介 2. 原理 3. 酶分类 4. DNA甲基化类型 5.机制 6. 十大DNA甲基化研究核心问题 6.1 植物中的甲基化 6.2 植物中DNA甲基化的主要功能 6.3 DNA甲基化作为生物标志物的潜力 6.4 DNA甲基化检测方法 1. DNA甲基化简介 DNA甲基化(DNA methy…

基于FPGA的图像RGB转HLS实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1计算最大值和最小值 4.2计算亮度L 4.3计算饱和度S 4.4计算色调H 5.算法完整程序工程 1.算法运行效果图预览 将FPGA结果导入到MATLAB显示效果: 2.算法运行软件版本 Vivado…

LeetCode(14)加油站【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 134. 加油站 1.题目 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加…

「Verilog学习笔记」用优先编码器①实现键盘编码电路

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 分析 用此编码器实现键盘的编码电路。 注意:编码器的输出是低电平有效,而键盘编码电路输出的是正常的8421BCD码,是高电平有效。因此将编…

opencv车牌识别<一>

目录 一、概述 二、ANPR简介 一、概述 本文将介绍创建自动车牌识别(Automatic Number Plate Recognition,ANPR)所需的步骤。对于不同的情形,实现自动车牌识别会用不同的方法和技术,例如,IR 摄像机、固定汽车位置、光照条件等…

C/C++轻量级并发TCP服务器框架Zinx-框架开发001: 读取标准输入,回显到标准输出

文章目录 完整代码实现参考-非项目使用项目使用的代码 - 乱-但是思路与上面的相同创建Kernel类添加删除修改epoll&#xff0c;才能写run方法创建stdin_Channel类在Kernel类中实现run方法 完整代码实现参考-非项目使用 #include <errno.h> #include <signal.h> #in…

Leetcode—122.买卖股票的最佳时机II【中等】

2023每日刷题&#xff08;二十八&#xff09; Leetcode—122.买卖股票的最佳时机II 实现代码 int maxProfit(int* prices, int pricesSize) {int totalProfit 0;if(pricesSize < 1) {return 0;}for(int i 1; i < pricesSize; i) {if(prices[i] - prices[i - 1] > …

The 8th China Open Source Conference Successfully Concludes

由开源社主办的第八届中国开源年会&#xff08;COSCon23&#xff09;于 2023年10月29日在成都圆满收官。本次大会&#xff0c;为期两天&#xff0c;线下参会报名逾千人次&#xff0c;在线直播观看人数总计 168610 人&#xff0c;直播观看次数达 248725 次&#xff0c;官网累计浏…

使用VScode编译betaflight固件--基于windows平台

使用VScode编译betaflight固件--基于windows平台 1、使用git克隆betaflight的开源代码2、betaflight的代码框架分析&#xff1a;3、配置编译环境&#xff1a;4、VScode上编译 betaflight不仅可以在LInux上进行编译也可以在Windows上编译&#xff0c;本文主要介绍在windows平台上…