Apache Orc 结构

前言 最近看完了数据库的行式存储后,也想总结下列式存储。列式存储也有多种实现方式,这里挑选熟悉的存储格式 orc,它在hive里使用的比较多。本篇会先讲讲它的设计结构,然后结合源码来理解,中间还会讲述一些……

Apache Orc 压缩原理

前言 orc 作为列式存储,其特点之一就是极高的数据压缩比,这篇文章就来讲讲它的压缩原理。 数据类型 orc 对于每种不同的数据类型,对应着不同的压缩方式。比如 string类型压缩,int 类型压缩,字节类型压缩。下面会……

Postgresql 动态哈希表实现

结构图 hash 表包含了多个 segment 切片,每个 segment 包含了相同数量的 bucket。里面的 bucket 使用链表存储着 hash 值相同的元素。 当查找指定的 key 时,首先计算出它的哈希值,然后根据后面的几位数,计算出对应的 bucket 位置。之后遍历 bucket 的元素……

postgresql 缓存池并发设计

前言 postgresql 对于缓存池的并发控制,比较复杂。下面通过一步步的优化,来讲述 postgresql 的设计思路。它为了提升锁的性能,大量使用了 CAS 操作,只有在操作比较慢的时候,才会加入读写锁。在继续阅读之前,需要熟悉它的存储设计,可以……

Postgresql 存储设计

架构图 用户查询指定 page 的数据 首先查询该 page 是否在缓存中,通过 hash table 快速查找它在缓存池的位置 如果存在,那么从缓存池读取返回 如果不存在需要从磁盘读取数据,并且放入到缓存池中,然后返回 postgresql 存储单位 postgresql 底层存储的数据交……

Postgresql Toast 原理

前言 上篇博客讲述了 postgresql 如何存储变长数据,它的应用主要是在 toast 。Toast 在存储大型数据时,会将它存储在单独的表中(称为 toast 表)。因为 postgresql 的 tuple(行数据)是存在在 Page 中的,Page 的大小默认为 8KB。pos……

Postgresql Varlena 结构

前言 postgresql 会有一些变长的数据类型,存储都是采用 varlena 格式的(除了 cstring 类型),通过语句 SELECT typname FROM pg_type WHERE typlen = -1就可以看到所有采用 varlena 格式的数据类型,比如常见的 text ,json 类型。 varlena 结构 varlena结构有一个通用的定义格式……

B+Tree 的并发优化 BLink-Tree

前言 B+Tree 被数据库普遍使用,作为索引实现的基础。网上的资料也非常多,所以这里也不再详细介绍。但是基于 B+Tree 的并发优化,资料却非常少,所以这篇来讲讲 B+Tree 的一种并发优化,那就是BLink-Tree。为了讲述得更加清……

Postgresql BRIN 索引原理

前言 postgresql 提供了块级索引(简称 BRIN),主要适用于类似时序数据之类的,有着天然的顺序,而且都是添加写的场景。相比于 btree 索引,它的体积小得多,非常适用于大数据量的场景。 原理 postgresql 按照一定的数目(默认 128, 可以……

Postgresql 物理流复制

postgresql 提供了主从复制功能,有基于文件的拷贝和基于 tcp 流的数据传输两种方式。两种方式都是传输 wal 数据,前者是等待生成一个完整的wal文件后,才会触发传输,后者是实时传输的。可以看出来基于文件方式的延迟会比较高,……