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

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 快速学习认识 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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
存储 SQL 缓存
15天学习MySQL计划-数据库引擎(进阶篇)第六天
15天学习MySQL计划-数据库引擎(进阶篇)第六天
92 0
|
SQL JSON 搜索推荐
认识 PostgreSQL 中与众不同的索引(一)|学习笔记
快速学习认识 PostgreSQL 中与众不同的索引(一)
278 0
认识 PostgreSQL 中与众不同的索引(一)|学习笔记
|
存储 运维 监控
PostgreSQL 监控实战(二)|学习笔记
快速学习 PostgreSQL 监控实战(二)
302 0
PostgreSQL 监控实战(二)|学习笔记
|
缓存 运维 监控
PostgreSQL 监控实战(一)|学习笔记
快速学习 PostgreSQL 监控实战(一)
703 0
PostgreSQL 监控实战(一)|学习笔记
|
关系型数据库 PostgreSQL 索引
《认识PostgreSQL中与众不同的索引》电子版地址
认识PostgreSQL中与众不同的索引
108 0
《认识PostgreSQL中与众不同的索引》电子版地址
|
存储 SQL JSON
索引与PostgreSQL新手
索引是优化数据库工作负载和减少查询时间的关键。PostgreSQL现在支持多种类型的索引,了解基础知识是使用PostgreSQL的关键部分。
201 1
索引与PostgreSQL新手
|
SQL 存储 JSON
认识PostgreSQL中与众不同的索引 ——唐成
认识PostgreSQL中与众不同的索引 ——唐成
认识PostgreSQL中与众不同的索引  ——唐成
|
SQL 自然语言处理 搜索推荐
【重新发现PostgreSQL之美】- 16 like '%西出函谷关%' 模糊查询
大家好,这里是重新发现PostgreSQL之美 - 16 like '%西出函谷关%' 模糊查询
|
SQL XML 缓存
【PostgreSQL 创新营】第二课:认识PostgreSQL中与众不同的索引 答疑汇总
【PostgreSQL 创新营】第二课:认识PostgreSQL中与众不同的索引 答疑汇总
592 0
【PostgreSQL 创新营】第二课:认识PostgreSQL中与众不同的索引  答疑汇总
|
SQL 前端开发 关系型数据库