【PGCCC】Postgresql Varlena 结构
前言postgresql 会有一些变长的数据类型,存储都是采用 varlena 格式的(除了 cstring 类型),通过语句 SELECT typname FROM pg_type WHERE typlen = -1就可以看到所有采用 varlena 格式的数据类型,比如常见的 text ,json 类型。varlena 结构varlena结构有一个通用的定义格式,如下所示struct
【PGCCC】Postgres 和 MySQL 应该怎么选?
这篇文章深入分析比较了 Postgres 和 MySQL 两种数据库,包括概览、核心比较(功能、性能、扩展性、安全性等)、使用场景和案例研究等。指出选择取决于多种因素,Postgres 适合复杂应用等,MySQL 适合初创和读密集型应用,最终决策要综合多方面信息。还推荐了 MySQL 学习教程文章。在建设任何应用系统时,选择合适的数据库是一个关键决策点,它直接影响到系统的性能、可扩展性、可维护性以
【PGCCC】为什么高性能场景选用Postgres SQL 而不是 MySQL
一、 数据库简介MySQL MySQL声称自己是流行的开源数据库,它属于流行的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。LAMP中的M指的就是MySQL。构建在LAMP上的应用都会使用MySQL. MySQL最初是由MySQL AB开发的,然后在2008年以10亿美金的价格卖给了Sun公司,Sun公司又在2010年被
【PGCCC】为什么 PostgreSQL 主要版本升级很困难
PostgreSQL 主版本之间的升级非常烦人。您不能只安装服务器二进制文件然后重新启动,因为数据目录的格式不兼容。为什么会这样?为什么我们不能保持数据格式兼容呢?令人惊讶的是,数据格式实际上大部分兼容,但并不完全兼容。出现一些很难解决的问题。让我们看看可能的升级程序:pg_upgrade使用 pg_dumpall 转储和恢复逻辑复制到新实例2 和 3 本质上是相同的想法:构建一个新的实例,并以更
【PGCCC】Postgresql Free Space Map 文件解析
前言postgresql 的表包含了多种类型的文件,其中 main 类型的文件存储实际的数据,以数据块的格式存储,称为 data block。一个 data block 包含了多条数据,当新建了一个data block 或者原有的数据被删除,那么这个 data block 就会有空闲位置,postgresql 使用 free space map 文件记录了每个 data block 的空闲空间,并
【PGCCC】Postgresql BRIN 索引原理
前言postgresql 提供了块级索引(简称 BRIN),主要适用于类似时序数据之类的,有着天然的顺序,而且都是添加写的场景。相比于 btree 索引,它的体积小得多,非常适用于大数据量的场景。原理postgresql 按照一定的数目(默认 128, 可以通过 pages_per_range 指定),将相邻的数据 Block 分成一组,然后计算它的的取值范围。当需要查看数据时,会先遍历这些取值范
【PGCCC】B+Tree 的并发优化 BLink-Tree
前言B+Tree 被数据库普遍使用,作为索引实现的基础。网上的资料也非常多,所以这里也不再详细介绍。但是基于 B+Tree 的并发优化,资料却非常少,所以这篇来讲讲 B+Tree 的一种并发优化,那就是BLink-Tree。为了讲述得更加清楚,我会通过图的形式,来详细阐述每一步骤。BLink-Tree 结构BLink-Tree,它与传统的 B+Tree 区别,就是非叶子节点,也会有个指向同层级的旁
【PGCCC】Postgresql 缓存替换算法
前言postgresql 使用缓存来作为与磁盘读写的中间层,但是缓存的大小是有限的,当缓存不够用时需要剔除一些不常用的。但是如何高效的选出那些需要剔除的缓存呢,postgresql 针对不同的应用场景,提供了简单高效的不同算法。替换算法postgresql 主要提供了两种替换算法,ring 算法和 clock sweep 算法,分别针对批量读写和正常读写。ring 算法ring算法适合那些批量读写
【PGCCC】pgvector 0.8.0 发布并可在 Nile 上使用
pgvector 社区发布了备受期待的 0.8.0 版本,该版本在性能和功能方面均有显著改进。我们当然迫不及待地想将它提供给 Nile 用户。发布亮点根据官方发布说明,pgvector 0.8.0 包括:增加了对迭代索引扫描的支持为 sparsevec 添加了数组强制类型转换改进成本估算,以便在过滤时更好地选择索引改进了 HNSW 索引扫描的性能改进了 HNSW 插入和磁盘索引构建的性能不再支持
【PGCCC】PostgreSQL 数据库设计中的文本标识符 | 翻译
无论是设计独立应用程序还是微服务,您都不可避免地会遇到共享标识符的话题。无论是网页的 URL、RESTful API 资源、JSON 文档、CSV 导出还是其他内容,特定资源的标识符都会被暴露。/orders/123 /products/345/variants/1虽然标识符只是一个数字,不带有任何负面含义,但您可能有充分的理由避免暴露它们。这些原因包括:安全性与数据暴露:数值标识符具有顺序性和
【PGCCC】PostgreSQL中有许多个timeout,逐个弄懂它们的含义和使用
1. deadlock_timeoutSets the time to wait on a lock before checking for deadlock这是进行死锁检测之前在一个锁上等待的时间量。死锁检测相对昂贵,因此服务器不会在每次等待锁时都运行这个它。我们乐观地假设在生产应用中死锁是不常出现的,并且只在开始检测死锁之前等待一会儿。增加这个值就减少了浪费在无用的死锁检测上的时间,但是减慢了
【PGCCC】Postgresql 存储设计
架构图用户查询指定 page 的数据首先查询该 page 是否在缓存中,通过 hash table 快速查找它在缓存池的位置如果存在,那么从缓存池读取返回如果不存在需要从磁盘读取数据,并且放入到缓存池中,然后返回postgresql 存储单位postgresql 底层存储的数据交互是以 Page 为单位的,它会负责将数据持久化到底层的文件系统里。postgresql 的这种设计应该是基于磁盘考虑的
【PGCCC】Postgresql 文件存储层
前言在 postgresql 数据库里,数据都会以表的形式组织起来。表的数据会被持久化到底层的磁盘里。负责与底层的磁盘交互,就是 postgresql 的文件存储层。本篇博客会依次介绍表的文件构成、分片机制和存储接口。表的文件类型postgresql 使用 RelFileNode 来标识一张表typedef struct RelFileNode { O
【PGCCC】Postgresql Toast 原理
前言上篇博客讲述了 postgresql 如何存储变长数据,它的应用主要是在 toast 。Toast 在存储大型数据时,会将它存储在单独的表中(称为 toast 表)。因为 postgresql 的 tuple(行数据)是存在在 Page 中的,Page 的大小默认为 8KB。postgresql 不允许 tuple 跨页存储,所以当一行数据的某个列数据过大时,比如 text 类型的数据,超过了
【PGCCC】Postgresql 编写自定义 C 函数
前言postgresql 支持自定义函数,并且还支持多种语言进行编写, 极大的提高了可扩展性。postgresql 支持使用 pgSQL(postgresql提供的类sql语言),python 和 c 语言来编写函数,本篇主要讲解 c 语言,因为它的性能是最好的。示例编写 c 函数分为三部分:编写 c 文件,定义函数实现编译程序,需要编译成共享库在 postgresql 中执行 CREA
【PGCCC】postgresql 缓存池并发设计
前言postgresql 对于缓存池的并发控制,比较复杂。下面通过一步步的优化,来讲述 postgresql 的设计思路。它为了提升锁的性能,大量使用了 CAS 操作,只有在操作比较慢的时候,才会加入读写锁。在继续阅读之前,需要熟悉它的存储设计,可以参考这篇文章 {% post_link postgresql-storage-architecture postgresql 存储设计 %} 。设计思
【PGCCC】Postgresql LWLock 原理
前言postgresql 的架构是基于多进程的,进程之间往往存在着数据共享,比如缓存读写。这时 postgresql 需要提高一种锁机制来支持并发访问,但是 linux 只实现了线程间的读写锁,所以 postgresql 自己实现进程间的读写锁,它主要利用了信号量和自旋锁来实现。进程结构每个进程都对应一个独立 PGPROC 实例,它包含了多个成员,下面只列出与锁相关的struc
【PGCCC】Postgresql slru 缓存和存储
前言简单的 lru 缓存管理(简称 slru),用于持久化数据并且提供 lru 算法来缓存。slru 在 postgresql 存在着多处使用,比如存储事务状态的 clog 日志,就是使用 slru 来管理的。缓存和文件的对应关系文件的数据都是存储在 page 里,每个 page 的大小都是相同的。这些连续的 page 就构成了文件。一个缓存对应着一个 page,所以缓存的大小和 page 的大小
在 Postgres 中创建日期箱的 4 种方法:interval、date_trunc、extract 和 to_char
在这篇文章中,我将介绍一些按日期查询数据的关键函数。有关在 Postgres 中存储日期和时间的最佳方法的摘要.interval——日期操纵的瑞士刀是interval用于修改其他时间的数据类型。例如,可以从已知时间中添加或减去间隔。间隔非常方便,是您按日期快速汇总数据的第一个方法。就像瑞士刀一样,它并不总是完成工作的最佳工具,但它可以在紧急情况下使用。让我们谈谈它的优势所在。我们如何运行查询来返回
【PGCCC】Postgresql 缓存池原理
前言postgresql 为了提高响应速度,在存储层上面添加了一层缓存,这样对于数据的查询和修改,都会先在缓存中操作,后面才会同步到磁盘。这样对于一些热点数据,性能提高非常明显。缓存的基本单位对应文件的一个 block,本篇主要介绍缓存池的原理和使用。缓存结构缓存分为共享缓存和本地缓存,共享缓存会被所有进程访问,一般普通的表和索引都会使用它。而本地缓存只有自身进程可以访问到,仅仅只有临时表使用。无