认识 PostgreSQL 中与众不同的索引(二)|学习笔记

简介: 快速学习认识 PostgreSQL 中与众不同的索引(二)

开发者学堂课程【PostgreSQL 实战进阶认识PostgreSQL 中与众不同的索引(二)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/112/detail/1906


认识 PostgreSQL 中与众不同的索引(二)

 

内容介绍:

一、PostgreSQL 中索引的总体介绍

二、BRIN 索引的使用案例

三、数组上建立 GIN 索引

四、快速查找某 IP 所属地区

五、让 like“%XXX%”中的“XXX”进入索引

六、GIN+JSON 数据类型形成用户画像


五、让 like“%XXX%”中的“XXX”进入索引

1、创建表

create table test01(id int,t text);

insert into test01 select seq,seq from generate_ series (1,1000000) as seq;

//创建并插入100万条测试数据

2、收集统计信息

analyze test01;

3、查询

explain analyze select*from test01 where t like'%99999%';

查询结果显示:

image.png

由于表上没有索引,只能进行扫描因此执行时间至少要100-300毫秒,且此时其访问的方式为B型若把B型关掉执行速度会更慢

4、like“%XXX%”走索引的方式

由于要寻找like后面中间的数据,对于其他数据库而言,这是一件无法实现的事情,但 PostgreSQL 却可以完成。

create extension pg_trgm;

//首先 PostgreSQL 本身有一个模糊主件的插件应先安装该插件

create index idx_test01_t on test01 using gin(t gin_trgm_ops);

//创建 GIN 索引。

建立索引时,gin 索引中有一个叫作 t gin_trgm_ops 的算法,该算法其实由前面安装的插件提供的

explain analyze select*from test01 where t like'%99999%';

再次查询,查询结果显示:

image.png

本次执行时间紧需要2ms。

 

六、GIN+JSON 数据类型形成用户画像

1、画像系统

(1)建立标签模型

以下是一个比较简单的标签模型

image.png

其中分了四类职业爱好学历性格职业包括农民工人IT 工程师理发师等爱好又简单分为游泳、乒乓球网球等,学历分为小学中学大学硕士博士等,性格又分为外向内向谨慎粗心浮躁自信

(2)建表

CREATE TABLE user_tag(uid serial primary key,tag jsonb);

//首先,第一个字段uid,用户的 id第二字段是 tag(打标签并将其设定为 jsonb 的数据类型

(3)造数据

要看用户画像的效果,还需要造些数据,造数据之前,需要编写一些辅助的函数来造数据辅助函数如下:

CREATE OR REPLACE FUNCTION f_random_attr(attr text[],max_attr int)

RETURNS text[ ] AS $$

DECLARE

i integer  := 0;

r integer  := 0;

res text[];

v text;

l integer;

num integer;

BEGIN

num :=(random()*max_attr)::int;

IF num < 1 THEN

num := 1;

END IF;

l :=array_length(attr,1);

WHILE i

r:=round(random()*l)::int +1;

v:=attr[r];

IF res @> array[v] THEN

continue;

ELSE

res :=array_append(res, v);

i := i + 1;

END IF;

END LOOP;

return res;

END; 

造数据:

INSERT INTO user_tag(uid,tag)

SELECT seq,

json_build_object(

'职业',f_random_attr(array['农民’,'工人','IT工程师','理

发师','医生’,'老师','美工','律师','公务员',"官员'].1),

'爱好',f_random_attr(array['游泳’,'乒乓球','羽毛球','网球','爬山','高尔夫球','滑雪','爬山','旅游'],5),

'学历',f_random_attr(array['无学历小学’,'初中','高中',

'中专','专科','本科','硕士','博士'], 1),

'性格',f_frandom_attr(array['外向','内向','谨慎','稳重','细心','粗心','浮躁','自信'],3))::jsonb

FROM generate_series(1, 10000) as t(seq);

10万条记录的数据而由于是造的数据,因此标签数据是随机生成的

image.png

可以发现人的性格爱好可以有多种组合。

4创建 GIN索引

CREATE INDEX idx_user_tag_tag on user_tag using gin(tag);

(5)查询

①查询性格为“外向”和“细心”的老师

select*from user_tag where tag @> '{"性格":["外向","细心"]} and tag @> '{"职业":["老师"]};

即查询包含“性格”为“外向”和“细心”,“职业”是“老师”的用户,以下为部分查询结果:

image.png

②查询性格为“外向”和“细心”而又喜欢“滑雪”和“游泳”的医生

*select*from user tag where tag @> '{"性格”:["外向","细心"]}' and tag@> '{"职业":["医生"]}' and tag @> '{"爱好":["滑雪","游泳"]}';

以下为部分查询结果:

image.png

查询其执行计划结果如下:

image.png

也就是说,当给用户打了标签之后输入一个 S QL 就可以查出具有我们需要的特征部分人来做数据分析

这就是利用 GIN+JSON 数据类型形成用户画像的简单例子,但是这个例子并不特别高效,只是为了学习下 GIN+JSON 数据的使用

2、更为实用的例子

阿里云官网上有更为使用的例子,

如 PostgreSQL 案例精选2-图像识别、人脸识别、相似特征检索、相似人群圈选,网址:

http://developer.aliyun.com/article/747642

篇文章中的例子则是完成一些具体的任务,同样是使用 PostgreSQL 的一些索引,当然在阿里云中是通过安装 RDS PG 的 pase 插件实现对图像等内容的快速搜索

再如阿里云一些 RDS for PostgreSQL varbitx 插件与实时画像有关的文章:

http://developer.aliyun.com/article/75335

http://help.aliyun.com/docunent_detail/142340.html

这些是非常大规模的数据,是具有很强的实战意义的使用画像的例子,阿里云为之提供了一些被运算的一些插件来辅助使得用画像更快。

阿里云 RDS PG 提供了很多插件它们结合 PG 完成内置索引,可以实现很多功能。 

以下为阿里云 PostgreSQL 支持的部分插件:

image.png

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
4月前
|
安全 编译器 测试技术
PHP 8 新特性解析:JIT编译器如何提升你的应用性能
PHP 8 新特性解析:JIT编译器如何提升你的应用性能
268 114
|
开发工具 Windows
关于 fatal error LNK1158: 无法运行“rc.exe” 的解决方法
关于 fatal error LNK1158: 无法运行“rc.exe” 的解决方法
关于 fatal error LNK1158: 无法运行“rc.exe” 的解决方法
|
9月前
|
缓存 Windows
文件剪切到一半取消了能找到吗?这样恢复文件试试
在日常电脑操作中,剪切文件时若因误操作或系统卡顿中途取消,可能导致文件“丢失”。本文详解剪切原理及不同场景下文件去向,并提供多种找回方法,包括检查原文件夹、搜索临时缓存、使用数据恢复工具等,助你避免误删风险,关键时刻挽回重要资料。
|
9月前
|
人工智能 搜索推荐 程序员
从产品经理视角深度解析五款热门AI产品:洞察创新与用户价值
本文从产品经理视角深度解析五款热门AI产品,包括ChatGPT、Midjourney、Notion AI、Perplexity与GitHub Copilot,剖析其成功要素与不足,总结AI产品设计的核心方法论,如用户体验优先、场景化落地、信任机制构建等,为AI时代的产品创新提供实践启示。
890 0
|
12月前
|
机器学习/深度学习 人工智能 算法
超越 DeepSeek-R1!Seed-Thinking-v1.5:字节跳动开源MoE架构推理模型,200B总参数仅激活20B,推理效率提升5倍
字节跳动推出的200B参数混合专家模型,在AIME/Codeforces/GPQA等基准测试中实现多项突破,采用强化学习框架与流式推理系统,支持7大领域复杂推理任务。
790 13
超越 DeepSeek-R1!Seed-Thinking-v1.5:字节跳动开源MoE架构推理模型,200B总参数仅激活20B,推理效率提升5倍
|
机器学习/深度学习 监控 API
合约量化/秒合约/永续合约对冲系统开发技术规则及源码示例
合约量化、秒合约、永续合约对冲系统的开发涉及策略编写、数据处理、交易执行、风险管理等关键技术。量化策略基于市场数据和机器学习,实现自动交易;秒合约强调高速交易和风险控制;永续合约通过资金费率机制平衡多空持仓。系统需具备高效的数据处理能力和实时监控功能,以确保交易的稳定性和安全性。
|
Ubuntu Linux Windows
wsl常用命令大全
WSL(Windows Subsystem for Linux)的常用命令,包括查看帮助、更新WSL、查看和管理Linux发行版、设置默认版本等,以帮助用户更有效地管理和使用WSL环境。
1388 1
|
Java 编译器
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
296 2
|
SQL 数据采集 BI
SQL CASE WHEN语句详解
SQL CASE WHEN语句详解
|
tengine 网络协议 Linux
关于长连接服务器和客户端之间要加入心跳的一些讨论
关于长连接服务器和客户端之间要加入心跳的一些讨论

热门文章

最新文章