postgresql 标签分组实战(可用于用户画像的实践)-数组篇

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 基于数组方式方面的基础应用,如有更大数据量的标签组合的时候,请参考下德哥写的文章 https://developer.aliyun.com/article/307731

postgresql 标签分组实战

数据初始化

构建用户标签关系表
drop table IF  EXISTS t_user_tag;
create table IF NOT EXISTS t_user_tag(userid int8 not null primary key,tagids int[]);
初始化随机长度数据,假设标签范围1-10
-- 生成随机长度的数据数据 ,这样子数据就比较离散点,做查询索引的话,才容易命中,如果都是重复数据,做索引意义不大
do language plpgsql $$
declare 
begin  
  for i in 1..1000000 loop  
      insert into t_user_tag values (i,
            (select array_agg(ceil(random()*10)::int) from generate_series(1,ceil(random()*10)::int))
            ); 
  end loop;  
end;  
$$; 

数据写入与变更操作演示

插入1条数据
-- 插入 10000001 用户数据, ARRAY 数组的代表方式
INSERT INTO t_user_tag
    VALUES (10000001,
    ARRAY[1, 2, 3, 4,5]);
-- 查询该数据
select * from t_user_tag where userid= 10000001;

更新数据
-- 更新数字的第一个元素为null,pg默认下标从1开始,也可以自己自定义
update t_user_tag set tagids[1] = null
where userid = 10000001;
-- 查询该数据
select * from t_user_tag where userid= 10000001;

-- 只保留2-4的4位数值
update t_user_tag set tagids = tagids[2:5]
where userid = 10000001;
-- 查询该数据
select * from t_user_tag where userid= 10000001;

update t_user_tag set tagids[6:7] = '{6,7}'
where userid = 10000001;
-- 查询该数据
select * from t_user_tag where userid= 10000001;

更新时使用函数操作(参考: http://www.postgres.cn/docs/14/functions-array.html

追加写入数据

update t_user_tag set tagids= array_append(tagids,11)
where userid = 10000001;
-- 查询该数据
select * from t_user_tag where userid= 10000001;

-- 另外一种追加方式
update t_user_tag set tagids= tagids||22
where userid = 10000001;
-- 查询该数据
select * from t_user_tag where userid= 10000001;

删除指定数据
-- 从数组中移除所有等于给定值的所有元素
update t_user_tag set tagids=  array_remove(tagids, 2)
where userid = 10000001;
-- 查询该数据
select * from t_user_tag where userid= 10000001;

批量修改
-- 将每一个等于给定值的数组元素替换成一个新值
-- 比如说将所有的 6 改成 3
update t_user_tag set tagids = array_replace(tagids,6,3)
where userid = 10000001;
-- 查询该数据
select * from t_user_tag where userid= 10000001;

数据查询

假设求取的是都包含了 标签5 和标签6的情况,有哪些
select * from t_user_tag
where  tagids @> '{6,5}' limit 10;

假设求取的是 包含了 标签5和标签6,并且最多标签为 5 个的情况下有哪些用户
select * from t_user_tag
where  tagids @> '{6,5}' 
and  array_length(tagids,1)<=5
limit 10;

假设求取的是只要有 标签7 或 标签9 的情况都筛选出来
select * from t_user_tag
where  tagids && '{7,9}' 
limit 10;

统计加速

构建索引
-- 构建索引 gin索引或 rum索引(支持排序操作)
CREATE INDEX idx_t_user_tag on t_user_tag using gin(tagids);
统计查询
-- 耗时90ms,其实内网下应该会更小的耗时
select count(1) from t_user_tag
where  tagids @> ARRAY[1,2,3];

统计分析

全表统计的情况下
select count(1) from t_user_tag

有以上基础后,可以尝试更大数据量的快速检索,例如2000亿数据量的检索如何实时实现

https://developer.aliyun.com/article/307731

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
6天前
|
存储 JSON 关系型数据库
《Postgresql实战》笔记(二)
《Postgresql实战》笔记(二)
41 0
|
6天前
|
存储 SQL Cloud Native
深入了解云原生数据库CockroachDB的概念与实践
作为一种全球领先的分布式SQL数据库,CockroachDB以其高可用性、强一致性和灵活性等特点备受关注。本文将深入探讨CockroachDB的概念、设计思想以及实践应用,并结合实例演示其在云原生环境下的优越表现。
|
6天前
|
Cloud Native 关系型数据库 大数据
CockroachDB:云原生数据库的新概念与实践
本文将介绍CockroachDB,一种先进的云原生数据库,它具备分布式、强一致性和高可用性等特点。我们将探讨CockroachDB的基本原理、架构设计以及在实际应用中的种种优势和挑战。
|
6天前
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL版并行查询技术探索与实践
PolarDB MySQL版并行查询技术探索与实践 PolarDB MySQL版在企业级查询加速特性上进行了深度技术探索,其中并行查询作为其重要组成部分,已经在线稳定运行多年,持续演进。本文将详细介绍并行查询的背景、挑战、方案、特性以及实践。
230 2
|
6天前
|
存储 关系型数据库 分布式数据库
数据管理的艺术:PolarDB开源版详评与实战部署策略(二)
PolarDB-PG是阿里云的一款云原生关系型数据库,100%兼容PostgreSQL,支持Oracle语法,采用Shared-Storage存储计算分离架构,提供极致弹性、毫秒级延迟的HTAP能力。具备高可用、高可靠和弹性扩展特性,支持单机、存储计算分离和X-Paxos三节点等多种部署形态。通过Docker可快速部署实例,包括单节点、一主一备和HTAP(一主两备)实例。此外,文章还介绍了在ECS上使用ESSD云盘搭建PolarDB-PG的详细步骤,适合开发和测试环境。
123321 14
|
6天前
|
存储 关系型数据库 MySQL
数据管理的艺术:PolarDB开源版详评与实战部署策略(一)
PolarDB-X是阿里巴巴自研的高性能云原生分布式数据库,基于共享存储的Shared-nothing架构,支持MySQL生态,具备金融级高可用、分布式水平扩展、HTAP混合负载等能力。它通过CN(计算节点)和DN(存储节点)实现计算与存储分离,保证数据强一致性,并支持全局二级索引和多主多写。PolarDB-X开源版提供更高程度的定制化和控制权,适合追求技术自主性和成本优化的开发者。部署方式包括RPM包、PXD工具和Kubernetes,其中PXD工具提供了一键部署的便利性。
102341 15
|
6天前
|
架构师 关系型数据库 分布式数据库
实战秘籍 | 《学姐和你一起学PolarDB-X》课程拓展资料(第二讲)
本期课程,由阿里云的开源架构师——黄心雨学姐为大家带来《使用云起实验室体验PolarDB分布式版》,在课后学姐还精心准备了拓展学习资料,供各位开发者们进一步探索和学习,早日成为数据大师!
|
6天前
|
架构师 开发者
实战秘籍 | 《学姐和你一起学PolarDB-X》课程拓展资料(第一讲)
本期课程,由阿里云的开源架构师——王江颖学姐为大家带来《PolarDB-X的架构介绍》,在课后学姐还精心准备了拓展学习资料,供各位开发者们进一步探索和学习,早日成为数据大师!
|
7月前
|
关系型数据库 数据管理 Go
《PostgreSQL数据分区:原理与实战》
《PostgreSQL数据分区:原理与实战》
128 0
|
6天前
|
关系型数据库 网络安全 数据库
《Postgresql实战》笔记(一)
《Postgresql实战》笔记(一)
54 0