3年部署3000套PG实例的架构设计与踩坑经验( 五 )
本文插图
在性能上 , 多字段and组合查询时Gin的性能可达到Btree的3倍 。
本文插图
但是Gin也不是万能的 , 它也有一些短板 , 有些场景下使用Gin索引会适得其反 。 概况起来主要有以下几点 , 需要注意:
- 两边界的范围查询效率很低;
- 按上下边界分别扫描 , 效率很低 。 但优化器的估算cost却严重偏低 , 容易误走gin索引
- 高基数字段的索引的效率不如btree;
- 空间占用
- 查询速度
- Fast update list过大的会影响点查询的QPS(可通过gin_pending_list_limit控制)
- 对固定的多字段AND组合查询(比如 a=1 and b=2) , 效率不如btree;
- 不支持唯一索引;
- 不支持使用索引优化like前缀匹配 , 比如like ‘abc%‘(pg_trgm支持);
- 不支持使用索引优化组合字段的oredr by , group by(单字段支持);
- 对更新的性能影响比btree更大;
- 比btree更容易膨胀 。
PostgreSQL是多进程架构 , 每一个连接对于一个进程 。 每个进程的私有内存空间中会缓存一些元数据 , 比如系统表数据 , 表定义 , 执行计划等等 。 如果使用不当 , 可能会由于后端进程私有内存占用过大导致系统内存不足 , 导致内存SWAP等问题 。
本文插图
我们可以用下面的命令查看某个后端进程的私有内存分配情况:
gdb --batch-silent -ex ‘call MemoryContextStatsDetail(TopMemoryContext,100)’ -p ${后端进程号}
执行上面的命令后 , 相关输出反应在PostgreSQL的日志文件中 。
本文插图
上面这个图里 , 私有内存的大部分被元数据缓存占用了 , 即CacheMemoryContext 。
通常 , 元数据缓存中占用内存最多的是下面两个系统表
- pg_statistic
- pg_attribute
本文插图
从上面的数据我们可以知道 , 表相关的元数据缓存占用内存的大小主要和下面几个因素有关:
- 查询实际访问的表或分区的数量
- 查询实际访问的字段的数量
- 调小应用端连接池大小(max pool size和min pool size);
- 部署pgbouncer连接池;
- 减少分区数;
- 访问不同表或分区的连接尽量隔离 , 比如需要访问全部分区的连接使用单独的连接池;
- 通过ALTER TABLE SET STATISTICS对不需要通过柱状图评估选择性的字段 , 减少收集的统计信息;
- 拆分负载 。
- 读写分离
- sharding
PostgreSQL的MVCC实现机制和其它传统的关系数据库不太一样 。 更新记录时不是在原地更新并且把修正的前镜像记录到UNDO日志 , 而是在数据文件中把原来的记录标记为“被删除”再插入一条新的记录 , 以后再通过VACUUM把这些”被删除“记录占用的空间回收掉 。 也就是说PostgreSQL中只有REDO日志 , 没有UNDO日志 。 在这种MVCC设计下 , PostgreSQL回滚事务可以立即完成 , 和事务大小无关 , 回滚事务时只需要在CLOG事务状态文件中标记这个事务的状态为ABORTED即可 。
推荐阅读
- 气球|花3年搞出气球的一千种死法 这操作把我看害怕了
- 苹果|被苹果打入冷宫!最便宜iOS设备超3年没更新了 满满都是回忆
- 阿里巴巴|东数西算全面爆火 概念股大面积涨停 阿里、腾讯、字节、快手已大规模部署
- 散热器|猫头鹰公布2022产品线路图:推迟了3年白色风扇将于Q4发售
- 电动车|元宇宙内自己造实车 这事真能成!A00级电动车 2023年交付
- GDP|中国第一个12万亿GDP大省诞生!连续33年全国领跑
- iPhone|苹果5.7寸iPhone SE前瞻:最快2023年登场
- 智能手机|男子扒前女友眼皮手机转账15万 判决来了:获刑3年半
- AMD|国外装机商统计了3年数据发现:Intel处理器比AMD更稳定可靠
- 华为|时隔3年 华为发布第2代空气净化器:1499元 支持鸿蒙
