PostgreSQL 收缩膨胀表或索引 - pg_squeeze or pg_repack
背景 PostgreSQL的表或索引发生膨胀后,用户可以使用vacuum full或rewrite table(如cluster)的方式重建表。 但是vacuum full或者rewrite都需要持有排它锁,会堵塞读操作。 为了减少锁冲突,社区有一个名为pg_reorg或pg_repack的插件,使用了增量的...
背景 PostgreSQL的表或索引发生膨胀后,用户可以使用vacuum full或rewrite table(如cluster)的方式重建表。 但是vacuum full或者rewrite都需要持有排它锁,会堵塞读操作。 为了减少锁冲突,社区有一个名为pg_reorg或pg_repack的插件,使用了增量的...
背景 数据库的HA是一个比较经典的话题,几乎所有的生产环境都会考虑给数据库部署HA。 PostgreSQL 的HA方案也很多,在我的GIT里有两个自定义的HA脚本,有兴趣的童鞋可以参考一下原理。 单个虚拟IP, 自动failover, 手动failback, 需fence设备 双虚拟IP, 自动failov...
背景 可以阅读以下几篇文章先回顾一下FDW,基于FDW的shared以及高效的分区插件pg_pathman。 《PostgreSQL 9.6 单元化,sharding (based on postgres_fdw) - 内核层支持前传》 《PostgreSQL 9.6 sharding + 单元化 (base...
背景 目前PostgreSQL社区版本的分区表功能比较弱,需要通过继承和触发器或RULE来实现分区表的功能,由于查询和更新涉及约束的检查、插入则涉及触发器或规则重写,导致分区功能性能较差。 商业版本EDB,以及数据仓库Greenplum都有比较好的分区支持。 去年GP开源后,阿里云RDS PostgreSQL...
背景 用户画像在市场营销的应用重建中非常常见,已经不是什么新鲜的东西,比较流行的解决方案是给用户贴标签,根据标签的组合,圈出需要的用户。 通常画像系统会用到宽表,以及分布式的系统。 宽表的作用是存储标签,例如每列代表一个标签。 但实际上这种设计不一定是最优或唯一的设计,本文将以PostgreSQL数据库为基...
背景 一般来说,数据库都会有序列的功能,例如PostgreSQL就支持序列。 序列是指一直增长的值,但是它有一个不好的地方,就是用掉后就不会再有了,因此对于使用者来说,可能会拿到空洞的值。 例如 ``` postgres=# create table seq_test(id serial, info tex...
背景 接触到越来越多MySQL的数据库迁移到PostgreSQL的需求,整理了一些从MySQL增量迁移到PostgreSQL的开源项目。 有一些是基于binlog的,增量效果比较好,有兴趣的童鞋可以参考一下。 有一些是比较通用的,例如结合Kafka的。 参考 1. https://github.com/xs...
背景 全文检索,模糊查询在现实的应用中用得非常多,特别是搜索引擎。 通常我们会想到使用搜索引擎来解决,但是需要考虑数据同步到搜索引擎,以及同步延迟,更新,一致性的问题。 并且使用搜索引擎我们还得多维护一个组件。 那么有没有更好的办法呢? 答案是有的,在PostgreSQL中,有内置的全文检索数据类型,以及...
背景 Bulk Collect and Binds
背景 PostgreSQL 几个统计信息的解释难以理解,所以本文花一些时间从源码的角度来解释一下。 让大家对这几个容易误解的统计值有更好的理解。 比较难理解的几个统计值为: pg_stat_all_indexes 的 idx_scan idx_tup_read idx_tup...