gin索引 btree索引 gist索引比较

创建例子数据

postgres=# create table t_hash as select id,md5(id::text) from generate_series(1,5000000) as id; 
SELECT 5000000
 
postgres=# vacuum ANALYZE t_hash;
VACUUM
 

postgres=# \timing
Timing is on.  

postgres=# select * from t_hash limit 10;
 id |               md5                
----+----------------------------------
  1 | c4ca4238a0b923820dcc509a6f75849b
  2 | c81e728d9d4c2f636f067f89cc14862c
  3 | eccbc87e4b5ce2fe28308fd9f2a7baf3
  4 | a87ff679a2f3e71d9181a67b7542122c
  5 | e4da3b7fbbce2345d7772b0674a318d5
  6 | 1679091c5a880faf6fb5e6087eb1b2dc
  7 | 8f14e45fceea167a5a36dedd4bea2543
  8 | c9f0f895fb98ab9159f51fd0297e236d
  9 | 45c48cce2e2d7fbdea1afc51c7c6ad26
 10 | d3d9446802a44259755d38e6d163e820
(10 rows)

Time: 1.430 ms

postgres=# 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: 2
   Workers 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: 1666666
 Planning Time: 0.115 ms
 Execution Time: 753.275 ms
(8 rows)

Time: 754.916 ms

安装插件pg_trgm

postgres=# create extension pg_trgm ;
CREATE EXTENSION

postgres=# 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 ms
 Execution 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: 4425762
 Planning Time: 6.721 ms
 Execution 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 ms
 Execution 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 ms
 Execution 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 ms
 Execution Time: 28.323 ms
(7 rows)

# btree索引情况
postgres=# create index idx_dx on t_hash(md5);
CREATE INDEX

postgres=# 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 ms
 Execution 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 MB

 postgres=# 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 2000000

postgres=# 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

八个开源免费单点登录(SSO)系统

使用SSO服务可以提高多系统使用的用户体验和安全性,用户不必记忆多个密码、不必多次登录浪费时间。下面推荐一些市场上最好的开源SSO系统,可作为商业SSO替代。 单点登录(SSO)是一个登录服务层,通过一次登录访问多个应…

做外贸一个小失误可能会带来大的损失

在外贸里,虽然很多事情都是不可控的,但是我们还是需要做好自己该做的事情,将危险和不可控降低到最低的程度。那如何能够降低到最低呢? 比如在做合同,发票或者单据的时候,我们可能会喜欢依照公司固定的模板…

鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

【iOS】将网络请求封装在一个单例类Manager中(AFNetworking、JSONModel)

项目开发中会请求大量不同的API,若将网络请求三板斧直接写在Controller中会代码十分冗杂,干脆直接将AFNetWorking和JSONModel封装到一个全局的Manager单例类中,在Manager类中进行网络请求和数据解析 导入AFNetworking和JSONModel 参考【iOS…

linux查看端口占用情况

lsof命令 lsof(list open files)命令可以列出当前系统中打开的所有文件,包括网络端口。可以使用lsof命令查看某个端口被哪个进程占用。 具体的命令为:sudo lsof -i :端口号,其中端口号为需要查询的端口号。 netstat命令 使用netstat命令&a…

很全的家政小程序功能开发攻略;

随着互联网的发展,家政行业也逐步走向数字化。为了满足用户的需求,家政APP的开发成为了热门趋势。那么,如何定制开发一款家政APP呢?下面将为大家详细介绍。 1. 明确需求:首先需要明确家政APP的功能,包括预约…

SAP 事件:SET PF-STATUS 和AT LINE-SELECTION共用

Write List中,如果同时使用了SET PF-STATUS 和 AT LINE-SELECTION,会发现双击的时候不好用了! 怎么办?其实,只要设置F2功能键”PICK”就OK了。 2007年12月11日修改: 如图: 例: REPORT z_barry_test_pic…

中海达为第七届全国水文勘测技能大赛保驾护航

11月6日至11日,第十届全国水利行业职业技能竞赛暨第七届全国水文勘测技能大赛在广东韶关成功举办。作为本次大赛相关设备技术保障团队,中海达积极提供全方位的技术支持和保障服务,助力大赛顺利进行。 ▲开幕式现场 全国水文勘测技能大赛自199…

【入门Flink】- 11Flink实现动态TopN

基本处理函数(ProcessFunction) stream.process(new MyProcessFunction())方法需要传入一个 ProcessFunction 作为参数,ProcessFunction 不是接口 , 而是一个抽象类 ,继承了AbstractRichFunction,所有的处…

墓园殡仪馆服务预约小程序的作用

生老病死是人之常情,也是每个人需要面对的,墓园作为生活服务行业里特殊的细分类别,往往不被人提起,但又有很高的需求度,几乎可以说每天都有大小生意,比如殡葬用品、祭扫预约、位置服务等。 对墓园管理公司而…

新能源充电桩物联网应用之工业4G路由器

新能源充电桩是智慧城市建设中不可缺少且可持续发展的重要设施,而工业4G路由器物联网应用为其提供了更加高效、智能、实时的管理方式。充电桩通过工业4G路由器可以与充电运营商的管理中心建立稳定的连接,实现双向数据传输,为用户提供优质的充…

深度学习 机器视觉 车位识别车道线检测 - python opencv 计算机竞赛

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) …

在线预览编辑PDF::RAD PDF for ASP.NET

RAD PDF for ASP.NET作为功​​能最齐全的基于 HTML 的 PDF 查看器、编辑器和 ASP.NET 表单填充器,RAD PDF 为传统 PDF 解决方案提供了灵活而强大的替代方案。与 Adob​​e Acrobat Reader 不同,RAD PDF 几乎可以在任何现代网络浏览器中运行,…

macOS 13.6 及后续系统安装 Asahi Linux 将破坏引导

导读Asahi Linux 是一个致力于为 Apple Silicon 设备带来 Linux 支持的项目,日前有用户反馈称,若在相关设备上安装了 macOS 13.6-14,再安装 Asahi Linux ,就会导致系统引导失败,出现“黑屏”情况。 目前 Asahi Linux 项…

第六章(微分方程)

简介 函数是客观事物的内部联系在数量方面的反映,利用两数关系又可以对客观事物的规律性进行研究.因此如何寻求函数关系,在实践中具有重要意义•在许多问题中,往往不能直接找出所需要的函数关系,但是根据问题所提供的情况&#xf…

基于SPI+DMA方式的ws2812b氛围灯控制

好处:相比于gpio控制,可以大大节省CPU的时间,CPU只要将要传输的数据计算好放入内存中,然后发动DMA传输即可,后续整个过程并不需要CPU干预,CPU可以用于做其他的事情。特别是某些带蓝牙的芯片,需要…

P6入门:项目初始化9-项目详情之资源Resource

前言 使用项目详细信息查看和编辑有关所选项目的详细信息,在项目创建完成后,初始化项目是一项非常重要的工作,涉及需要设置的内容包括项目名,ID,责任人,日历,预算,资金,分类码等等&…

基于51单片机PCF8591数字电压表LCD1602液晶显示设计( proteus仿真+程序+设计报告+讲解视频)

基于 51单片机PCF8591数字电压表LCD1602液晶设计 ( proteus仿真程序设计报告讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0060 51单片机PCF8591数字电压表LCD1602液晶设计 1.主要功…

C# +.Net检验科信息管理系统源码 LIS系统源码

检验科信息管理系统(LIS) LIS系统集申请、采样、核收、计费、检验、审核、发布、质控、查询、耗材控制等检验科工作为一体的网络管理系统。它的开发和应用将加快检验科管理的统一化、网络化、标准化的进程。 主要包括以下功能: 1、数据采集…

分享一下微信签到领取积分的小程序怎么做

在当前的数字化时代,微信作为中国最流行的社交平台,其影响力已经渗透到生活的各个角落。除了基础的聊天功能,微信还提供了许多实用的附加功能,其中就包括微信签到领取积分这一独特的小程序。本文将探讨微信签到领取积分小程序的魅…