「PostgreSQL高级特性」PostgreSQL 数据库的近似算法

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 「PostgreSQL高级特性」PostgreSQL 数据库的近似算法

在较早的博客文章中,我写了关于如何将问题分解为MapReduce样式的方法可以如何为您提供更好的性能。当我们能够在集群中所有核心之间并行化工作负载时,我们发现Citus比单节点数据库快几个数量级。虽然计数(*)和平均数很容易分解成较小的部分,但我立即想到了一个问题,即计数不重复数,列表中的最高值或中位数是什么?

公认的是,在大型分布式设置中,确切的非重复计数更难解决,因为它需要在节点之间进行大量数据转换。Citus确实支持不重复计数,但是在处理特别大的数据集时有时会很慢。任何中型到大型数据集的中位数都可能对最终用户完全禁止。幸运的是,几乎所有这些算法都有近似算法,可以提供足够接近的答案,并且具有令人印象深刻的性能特征。

HyperLogLog的近似唯一性

在某些类别的应用程序中,例如网络分析,物联网(物联网)和广告,计算某事物发生的不同次数是一个共同的目标。HyperLogLog是PostgreSQL数据类型扩展,它允许您获取原始数据并将其压缩为一段时间内存在的唯一身份值。

将数据保存到HLL数据类型的结果是,星期一的值将为25,而星期二的值将为20。与原始数据相比,此数据压缩后的压缩量要大得多。但是真正令人赞叹的是,您可以然后合并这些存储桶,通过合并两个HyperLogLog数据类型,您可以返回星期一和星期二有25个唯一身份,因为星期二您有10个重复访客:

SELECT hll_union_agg(users) as unique_visitors FROM daily_uniques; unique_visitors ----------------- 35 (1 row)

于HyperLogLog可以通过这种方式拆分和组合,因此还可以跨Citus群集中的所有节点很好地并行化

使用TopN查找重要事项

我们通常在Web分析,广告应用程序和安全性/日志事件应用程序中发现的另一种计数形式是希望知道已发生的最主要的操作或事件集。这可能是您在Google Analytics(分析)中看到的首页视图,也可能是事件日志中发生的主要错误。

TopN利用基础JSONB数据类型存储其所有数据。但随后会维护一个列表,其中是最重要的项目以及有关这些项目的各种数据。随着订单的改组,它会清除旧数据,从而使其现在必须维护所有原始数据的完整列表。

为了使用它,您将以与HyperLogLog类似的方式插入它:

# create table aggregated_topns (day date, topn jsonb); CREATE TABLE Time: 9.593 ms # insert into aggregated_topns select date_trunc('day', created_at), topn_add_agg((repo::json)->> 'name') as topn from github_events group by 1; INSERT 0 7 Time: 34904.259 ms (00:34.904)

在查询时,您可以轻松获取数据的前十名列表:

SELECT (topn(topn_union_agg(topn), 10)).* FROM aggregated_topns WHERE day IN ('2018-01-02', '2018-01-03'); ------------------------------------------------+----------- dipper-github-fra-sin-syd-nrt/test-ruby-sample | 12489 wangshub/wechat_jump_game | 6402 ...

不只是计数和列表

前面我们提到过,像中位数这样的运算可能会困难得多。尽管扩展可能尚不存在,但未来可以支持这些操作。对于中位数,存在多种不同的算法和方法。可以应用于Postgres的两个有趣的方法:

  • T-digest -提供大约百分位数
  • HDR (high dynamic range) -提供更好的压缩效果,但只专注于前99%和更高的百分位数

如果答案能在数TB的数据范围内达到亚秒级响应,那么答案是否完全接近但又不能完全满足您的需求?以我的经验,答案通常是肯定的。

因此,下次您认为分布式设置中不可能实现某些功能时,请研究一下存在哪些近似算法。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
7月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
3月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
3月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
3月前
|
机器学习/深度学习 传感器 算法
基于不变扩展卡尔曼滤波器RI-EKF的同时定位与地图构建SLAM算法的收敛性和一致性特性研究(Matlab代码实现)
基于不变扩展卡尔曼滤波器RI-EKF的同时定位与地图构建SLAM算法的收敛性和一致性特性研究(Matlab代码实现)
111 2
|
6月前
|
SQL 关系型数据库 MySQL
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
478 62
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
4月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
341 0
|
6月前
|
存储 关系型数据库 分布式数据库
【赵渝强老师】基于PostgreSQL的分布式数据库:Citus
Citus 是基于 PostgreSQL 的开源分布式数据库,采用 shared nothing 架构,具备良好的扩展性。它以插件形式集成,部署简单,适用于处理大规模数据和高并发场景。本文介绍了 Citus 的基础概念、安装配置步骤及其在单机环境下的集群搭建方法。
493 2
|
6月前
|
算法
基于RMD算法模型的信号传输统计特性的matlab模拟仿真
本项目基于RMD(Random Midpoint Displacement)算法模型,使用MATLAB 2022A进行信号传输统计特性的模拟仿真。通过递归在区间中点加入随机位移,生成具有自相似性和长相关性的随机信号,实现了文中多个仿真图,并提供操作视频与中文注释代码。RMD模型生成的信号均值为零,方差无穷大,具备低误码率、强抗干扰能力及高传输效率等优势,为现代通信系统提供了新思路。

热门文章

最新文章