【PostgreSQL】GIN索引安装与使用 - 全模糊匹配/数组匹配,PG批量插入上万随机生成数据,随机生成字符串/数组
目录
- 环境
- 拓展库安装
- 生成随机假数据
- 查询使用GIN索引
- GIN索引使用条件
- 参考
环境
PostgreSQL
DBeaver
拓展库安装
打开SQL编辑器:
输入命令运行即可:
CREATE EXTENSION pg_trgm;CREATE extension btree_gin;
(光标选中某行后,按ctrl + enter可以只运行选中SQL)
其它安装情况可以参考网上教程如:
https://www.kancloud.cn/chunyu/php_basic_knowledge/2280100
随后我们查看拓展库是否安装完成:
--查看pg拓展库
select * from pg_extension;
生成随机假数据
建表语句有:
--创建实验表
CREATE TABLE public.index_learn_t_gin1 (id numeric NULL,"name" varchar NULL,"content" varchar NULL,"arr" numeric(4)[]
);
随后我们要造假数据,为了合适模糊搜索,最好是随机生成的:
随机生成字符串语句如下:
--生成随机字符串
select string_agg(substring('0123456789abcdefghjklmnopqrstuvwxyz', round(random() * 40)::integer, 1), '') from generate_series(1, 10);
有结果:
随机生成中文如下:
select string_agg(substring('的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该冯价严龙飞', round(random() * 500)::integer, 1), '') from generate_series(1, 10);
有结果:
生成随机数组
--生成随机数组
select array(select random()*1000 from generate_series(1, 10));
结合这些方法,我们生成10万条随机假数据插入表中,有脚本如下:
--批量插入数据
do language plpgsql $$ declare begin for i in 1..100000 loop insert into index_learn_t_gin1 select i, string_agg(substring('0123456789abcdefghjklmnopqrstuvwxyz', round(random() * 40)::integer, 1), ''),string_agg(substring('的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该冯价严龙飞', round(random() * 500)::integer, 1), ''),array(select random()*1000 from generate_series(1, 10))from generate_series(1, 10); end loop; end; $$;
要稍微等一下,完成后有:
查看表有:
我们有中文,有英文,有数组
查询使用GIN索引
创建索引前先做一下三组条件查询:
--查询结果与分析,全模糊匹配
select id, name, content, arr from index_learn_t_gin1
where name like '%dad%'
;
explain analyze select id, name, content, arr from index_learn_t_gin1
where name like '%dad%'
;
--查询结果与分析,中文全模糊匹配
select id, name, content, arr from index_learn_t_gin1
where content like '%大中国%'
;
explain analyze select id, name, content, arr from index_learn_t_gin1
where content like '%大中国%'
;
--查询结果与分析,数组匹配
select id, name, content, arr from index_learn_t_gin1
where arr @> array[333.0,444.0]
;
explain analyze select id, name, content, arr from index_learn_t_gin1
where arr @> array[333.0,444.0]
;
逐个执行后,可以看看explain结果,这些查询都不走索引。
接下来创建GIN索引:
--创建GIN索引
CREATE INDEX idx_index_learn_t_gin1_name ON public.index_learn_t_gin1 USING gin (name GIN_TRGM_OPS);
CREATE INDEX idx_index_learn_t_gin1_content ON public.index_learn_t_gin1 USING gin (content GIN_TRGM_OPS);
CREATE INDEX idx_index_learn_t_gin1_arr ON public.index_learn_t_gin1 USING gin (arr);
数据量比较大,创建索引也会耗时长,索引占用的空间也大,创建完后有:
这时候我们再分析执行计划,先是英文全模糊匹配:
--查询结果与分析,全模糊匹配
select id, name, content, arr from index_learn_t_gin1
where name like '%dad%'
;
explain analyze select id, name, content, arr from index_learn_t_gin1
where name like '%dad%'
;
可以看到走索引了
再看看中文全模糊匹配:
--查询结果与分析,中文全模糊匹配
select id, name, content, arr from index_learn_t_gin1
where content like '%大中国%'
;
explain analyze select id, name, content, arr from index_learn_t_gin1
where content like '%大中国%'
;
看看数组匹配:
--查询结果与分析,数组匹配
select id, name, content, arr from index_learn_t_gin1
where arr @> array[333.0,444.0]
;
explain analyze select id, name, content, arr from index_learn_t_gin1
where arr @> array[333.0,444.0]
;
GIN索引使用条件
如果全模糊匹配,字符少于3个(1个或2个时),则不走索引,不论中英文都如此:
--不走索引的情况
explain analyze select id, name, content, arr from index_learn_t_gin1
where name like '%ad%'
;
explain analyze select id, name, content, arr from index_learn_t_gin1
where content like '%中国%'
;
因此GIN索引 1个 2个字符都不走索引,3个字符以上才开始走索引
参考
https://qa.1r1g.com/sf/ask/2557340061/
https://www.kancloud.cn/chunyu/php_basic_knowledge/2280100
https://www.5axxw.com/questions/content/ejmks5
【PostgreSQL】GIN索引安装与使用 - 全模糊匹配/数组匹配,PG批量插入上万随机生成数据,随机生成字符串/数组相关推荐
- Postgresql GIN索引
GIN概念介绍: GIN是Generalized Inverted Index的缩写.就是所谓的倒排索引.它处理的数据类型的值不是原子的,而是由元素构成.我们称之为复合类型.如('hank', '15 ...
- pg批量插入_在PostgreSQL中批量/批量更新/提升
我正在编写一个Django-ORM功能,尝试缓存模型并推迟模型保存,直到事务结束.这几乎完成了,但是我遇到了SQL语法中的意外困难. 我不是一个DBA,但从我的理解,数据库不能真正有效地为许多小的查询 ...
- postgreSQL源码分析——索引的建立与使用——GIN索引(3)
2021SC@SDUSC 本篇博客继续讲解GIN索引创建和插入相关的函数,并讲解GIN索引的查询过程 目录 GIN索引的创建 ginbuild 插入函数 ginEntryInsert GIN索引查询 ...
- postgresql批量插入数据脚本_每日踩坑 2020-11-04 PostgreSQL 批量插入数据
一看居然两三个月没写博文了.凑.最近去考了个试,老天保佑吧. 今天有个同事跑来问我,我之前写的数据同步工具支不支持 PostgreSQL. 然后跟我讲了他的需求.感觉我随手写的小东西开始变成整个部门的 ...
- sql加上唯一索引后批量插入_MySQL当批量插入遇上唯一索引
一.背景 以前使用SQL Server进行表分区的时候就碰到很多关于唯一索引的问题:Step8:SQL Server 当表分区遇上唯一约束,没想到在MySQL的分区中一样会遇到这样的问题:MySQL表 ...
- sql加上唯一索引后批量插入_MySQL批量插入遇上唯一索引避免方法
一.背景 以前使用SQL Server进行表分区的时候就碰到很多关于唯一索引的问题:Step8:SQL Server 当表分区遇上唯一约束,没想到在MySQL的分区中一样会遇到这样的问题:MySQL表 ...
- PostgreSQL实现批量插入、更新与合并操作的方法_PostgreSQL_脚本之家
前言 就在 2019 年 1 月份微软收购了 PostgreSQL 数据库的初创公司 CitusData, 在云数据库方面可以增强与 AWS 的竟争.AWS 的 RDS 两大开源数据库就是 MySQL ...
- postgresql两个列模糊比较_数据分析之SQL优化系列(二)---PostgreSQL 的索引
参考<PostgreSQL11.2-中文手册> 下面这个链接,讲的通俗易懂,可以看看. 数据分析师不得不知道的SQL优化 - 鑫获 - 博客园www.cnblogs.com 索引是提高数 ...
- postgreSQL源码分析——索引的建立与使用——GIN索引(2)
2021SC@SDUSC 本篇博客主要讲解Gin索引创建和插入的过程和相关的数据结构,由于过程较为复杂,会在下一篇博客会具体分析相关函数. 目录 GIN创建 创建过程 主要数据结构 GinBuildS ...
最新文章
- linux基础知识-链接列表
- javaScript中表单的验证
- Android 自定义百分比视图
- Linux服务器网卡驱动安装及故障排除(转)
- POJ1195Mobile phones
- posix多线程有感--线程高级编程(条件变量)
- windows+php+mysql+apache(wamp)安装配置问题
- 创建一个学生信息表,与页面分离
- Java 9 将采用新的版本字符串格式
- 测试一下你对IP地址的掌握水平
- scrapy 命令行基本用法
- 连接最大数 详解(C++)
- 洛谷2678跳石头----二分答案入门
- overleaf表格_latex插入表格心得
- JavaScript——DOM文档
- JS 把 Wed Jul 15 2015 00:00:00 GMT+0800 转换成2015-07-15
- android中weight计算方法,详解Android中weight的使用方法
- wps里面如何使用计算机,wps表格中怎么在多行之间每行插一行?
- VMware16.0如何装win7和win10
- idea debug源码