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.mzph.cn/news/144230.shtml

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

相关文章

areadetector ADURL模块应用在面探测控制的初步应用

本章中讨论了使用ADURL控制面探测器Lambda的过程&#xff1a; ADURL的使用请见&#xff1a; EPICS -- areaDetector URL驱动程序-CSDN博客 需要启动一个ADURL的IOC程序&#xff0c;并且设置相关的插件中参数的值&#xff1a; # st.cm < envPaths < st_base.cmddbpf 1…

一个22届被裁前端思想上得转变

距离上篇文章已经过去了三个多月&#xff0c;这个三个月&#xff0c;经历了技术攻坚&#xff0c;然后裁员&#xff0c;退房&#xff0c;回老家&#xff0c;找工作。短短的几个月&#xff0c;就经历社会的一次次毒打&#xff0c;特别是找工作&#xff0c;虽然算上实习我也有两年…

MAC地址_MAC地址格式_以太网的MAC帧_基础知识

MAC地址 全世界的每块网卡在出厂前都有一个唯一的代码,称为介质访问控制(MAC)地址 一.网络适配器(网卡) 要将计算机连接到以太网&#xff0c;需要使用相应的网络适配器(Adapter)&#xff0c;网络适配器一般简称为“网卡”。在计算机内部&#xff0c;网卡与CPU之间的通信&…

dewarp:数据变换

一. 效果 输入图片&#xff1a;test.jpg 前向场:test.npy 输出图片&#xff1a;dewarp_img.jpg 二. 代码 import os import cv2 import numpy as npdef align_flow(image, flow):"""flow: -1~1, 非文本区域是nanbm_flow: 对齐的bm&#xff0c;可以直接对图…

OpenSign:安全可靠的电子签名解决方案 | 开源日报 No.76

microsoft/Web-Dev-For-Beginners Stars: 71.5k License: MIT 这个开源项目是一个为期 12 周的全面课程&#xff0c;由微软云倡导者团队提供。它旨在帮助初学者掌握 JavaScript、CSS 和 HTML 的基础知识。每一节都包括预习和复习测验、详细的书面指南、解决方案、作业等内容。…

图解分布式事务实现原理(一)

参考 本文参考https://zhuanlan.zhihu.com/p/648556608&#xff0c;在小徐的基础上做了个人的笔记。 分布式事务场景 事务核心特性 在聊分布式事务之前&#xff0c;我们先理清楚有关于 “事务” 的定义. 事务 Transaction&#xff0c;是一段特殊的执行程序&#xff0c;其需…

OceanBase杨冰:完全自研,才能逢山开路遇水搭桥

11月16日&#xff0c;在OceanBase2023年度发布会上&#xff0c;OceanBase CEO杨冰介绍&#xff0c;中国数字经济的蓬勃发展催生了对分布式数据库的强大需求&#xff0c;这种需求也牵引了OceanBase坚定投入自主研发&#xff0c;从而推动树立了分布式数据库的四项新标准。 据了解…

PLC电力载波通讯,一种新的IoT通讯技术

前言: PLC-IoT 是 PLC 技术应用在物联场景的创新实践,有效解决电力线路信号干扰、衰减问题,支持 IP 化通信能力,使能终端设备智能化,构建智慧边缘联接。PLC让传统IoT有了更多的连接可能: 电力线通信技术适用的场景包括电力配用电网络、城市智慧路灯、交通路口信号灯、园…

【ROS导航Navigation】五 | 导航相关的消息 | 地图 | 里程计 | 坐标变换 | 定位 | 目标点和路径规划 | 激光雷达 | 相机

致谢&#xff1a;ROS赵虚左老师 Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 参考赵虚左老师的实战教程 一、地图 nav_msgs/MapMetaData 地图元数据&#xff0c;包括地图的宽度、高度、分辨率等。 nav_msgs/OccupancyGrid 地图栅格数据&#…

js添加dom到指定div之后,并给添加的dom类名,然后设置其样式,以及el-popover层级z-index过高问题解决。

遇到一个需求,Vue项目做一个表格,要求表头与表格内容分开,如下效果所示,表头与表格有个高度间隔边距(箭头所示),因为默认我们的el-table的表头与内容是一起的: 思路:通过querySelector获取el-table__header-wrapper元素,通过createElement创建一个div,通过 newElem…

WebStorm配置less编译wxss或css

文章目录 前言先下载安装less程序&#xff1a;实参&#xff1a;要刷新的输出路径成功 前言 使用WebStorm写微信小程序&#xff0c;wxss写着很麻烦&#xff0c;就想着用less&#xff0c;接下来是配置less编译 先下载安装less npm install -g lessless会安装在你当前目录下(以D…

P1941 飞扬的小鸟

P1941 飞扬的小鸟 Description Flappy Bird 是一款风靡一时的休闲手机游戏。玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度&#xff0c;让小鸟顺利通过画面右方的管道缝隙。如果小鸟一不小心撞到了水管或者掉在地上的话&#xff0c;便宣告失败。 为了简化问题&am…

【数据结构】树与二叉树(十一):二叉树的层次遍历(算法LevelOrder)

文章目录 5.2.1 二叉树二叉树性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点&#xff0c;其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…

大模型幻觉成应用落地难题 最新评测文心一言解决幻觉能力最好文心一言解决幻觉能力最好 或成产业应用首选

“林黛玉倒拔垂杨柳”、“月球上面有桂树”、“宋江字武松”……相信经常使用大语言模型都会遇到这样“一本正经胡说八道”的情况。这其实是大模型的“幻觉”问题&#xff0c;是大模型行业落地的核心挑战之一。例如幻觉会影响生成内容的可靠性&#xff0c;对于法律、金融、医疗…

算法-贪心算法-简单-买卖股票的最佳时机

记录一下算法题的学习4 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这…

预览PDF并显示当前页数

这里写目录标题 步骤实例实例效果图 步骤 1.安装依赖 npm install --save vue-pdf2.在需要的页面&#xff0c;引入插件 import pdf from vue-pdf3.使用 单页pdf可以直接使用 <pdf :src"获取到的pdf地址"></pdf>多页pdf通过循环实现 html标签部分 &l…

【机器学习基础】机器学习入门(1)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;专栏介绍&#xff1a; 本专栏的第一篇文章&#xff0c;当然要介绍一下了~来说一下这个专栏的开…

EDMA的组成及其作用简介

EDMA是什么&#xff1f; 答&#xff1a;EDMA&#xff08;Enhanced Direct Memory Access&#xff09;是一种增强型的直接内存访问技术&#xff0c;用于高效地实现数据传输和处理。它是在传统的DMA&#xff08;Direct Memory Access&#xff09;基础上进行改进和扩展的。DMA是一…

大语言模型量化方法对比:GPTQ、GGUF、AWQ

在过去的一年里&#xff0c;大型语言模型(llm)有了飞速的发展&#xff0c;在本文中&#xff0c;我们将探讨几种(量化)的方式&#xff0c;除此以外&#xff0c;还会介绍分片及不同的保存和压缩策略。 说明&#xff1a;每次加载LLM示例后&#xff0c;建议清除缓存&#xff0c;以…

(四)什么是Vite——冷启动时vite做了什么(源码、middlewares)

vite分享ppt&#xff0c;感兴趣的可以下载&#xff1a; ​​​​​​​Vite分享、原理介绍ppt 什么是vite系列目录&#xff1a; &#xff08;一&#xff09;什么是Vite——vite介绍与使用-CSDN博客 &#xff08;二&#xff09;什么是Vite——Vite 和 Webpack 区别&#xff0…