PostgreSQL “乱弹” 从索引性能到开发优化

article/2025/7/19 20:52:29

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共3000人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6 7群均已爆满,开8群350+ 9群 100+)

PostgreSQL字段类型与创建索引和查询之间的关系,通过这篇文章,我们希望数据库管理员以及开发人员能认识到,在PostgreSQL选择正确的数据类型对于数据处理和查询的优势,更进一步的论证,各个POSTGRESQL数据类型在数据处理中的损耗。

这里我们通过 int,bigint,float,numeric,text等字段来进行相关的测试。

通过下面我们可以看到各个字段在建立索引时的时间。

创建表
创建表
插入数据
插入数据
db1=# 
db1=# \d+ t_demoTable "public.t_demo"Column |       Type       | Collation | Nullable | Default | Storage  | Compression | Stats target | Description 
--------+------------------+-----------+----------+---------+----------+-------------+--------------+-------------v1     | integer          |           |          |         | plain    |             |              | v2     | bigint           |           |          |         | plain    |             |              | v3     | double precision |           |          |         | plain    |             |              | v4     | numeric          |           |          |         | main     |             |              | v5     | text             |           |          |         | extended |             |              | 
Access method: heapdb1=# \timing 
Timing is on.
db1=# CREATE INDEX ON t_demo (v1); -- int
CREATE INDEX
Time: 24008.908 ms (00:24.009)
db1=# 
db1=# CREATE INDEX ON t_demo (v2);
CREATE INDEX
Time: 25224.961 ms (00:25.225)
db1=# 
db1=# 
db1=# CREATE INDEX ON t_demo (v3);
CREATE INDEX
Time: 40735.718 ms (00:40.736)
db1=# 
db1=# CREATE INDEX ON t_demo (v4);
CREATE INDEX
Time: 56503.447 ms (00:56.503)
db1=# 
db1=# 
db1=# 
db1=# CREATE INDEX ON t_demo (v5);
CREATE INDEX
Time: 156576.956 ms (02:36.577)
db1=#

表的列的释义

列名

数据类型

存储方式

描述

v1

integer

plain

整数类型

v2

bigint

plain

大整数类型

v3

double precision

plain

浮点数

v4

numeric

main

高精度数值

v5

text

extended

文本

列名

数据类型

索引创建耗时(ms)

索引创建耗时(格式化)

v1

integer

24008.908

00:24.009

v2

bigint

25224.961

00:25.225

v3

double precision

40735.718

00:40.736

v4

numeric

56503.447

00:56.503

v5

text

156576.956

02:36.577

通过上图我们创建索引的时间可以看出,随着数据的精度提高,创建索引的时间逐步提高。原因是什么,这就要说到CPU的指令集。CPU 在处理数据中使用的是指令集,这就牵扯到CPU硬件本身支持的原始数据类型,如整形,浮点等都是CPU直接支持的原始类型。这与CPU内部的寄存器的宽度对应。

而如POSTGRESQL这样的数据库产品,使用C语言进行编写,C语言针对原始的数据类型设计为直接映射到CPU的原生数据类型。原始的数据类型可以产生编译器高度优化的机器代码。从而利用CPU固有的方式来处理这些数据类型。效率来自于直接性,任何无法直接进行处理的数据类型,都需要进行转换,这就是上面bigint 比 int大一倍,处理的速度并没有慢一倍的原因。

类型类别

典型名称

常见大小(位/字节)

有符号范围

无符号范围

相关 CPU/架构/标准

整数

Byte, octet, char (C99)

8 位 / 1 字节

-128 到 +127

0 到 255

x86, C99

整数

x86 word, short, int (C)

16 位 / 2 字节

-32,768 到 +32,767

0 到 65,535

x86, C

整数

x86 double word, int, long (C)

32 位 / 4 字节

-2,147,483,648 到 +2,147,483,647

0 到 4,294,967,295

x86, C

整数

x86 quadruple word, long long, long (C)

64 位 / 8 字节

-9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807

0 到 18,446,744,073,709,551,615

x86, C

浮点数

float

32 位 / 4 字节

IEEE 754 单精度

N/A

IEEE 754

浮点数

double

64 位 / 8 字节

IEEE 754 双精度

N/A

IEEE 754

布尔值

Boolean, bool

1 位(通常为 1 字节)

N/A

True / False

多数语言 / 硬件


除此以外,在内存中的内存对齐对于建立索引的速度也有影响,如B树的构建是需要在内存中进行建立的,然后在持久化到磁盘中,对数据在内存访问的方式是影响索引建立速度的第二个点,那么什么是内存对齐。

我们画一个图来举一个例子:

内存结构如何存储数据
内存结构如何存储数据

上图中很明显,在内存中我们的 char和int结构在内存中基于a是一个字节,则会匹配3个pad来进行地址的对齐。上面的案例就是不对齐的情况,而编译器在a 和 b之间进行了对齐。

说完这些,很多人看到这里很可能不知道这篇文章要说什么,按照我一贯的风格,马上就要突变。因为要说到开发,表设计,PostgreSQL的表设计。

在PostgreSQL中我们都明白,基于PG的原理

1 索引越少越少越好

2 索引越小越好

(如果你还不明白为什么,说明你对PG的原理不明晰,不清楚)

那么在明白了原理上面的比较后,我们要做的就是下一步,如何让索引变少,如何让索引变小。


方案 1:

替代法:在很多商业数据库中都这样设计,原因有几个其中最初的目的并不是为了要节省索引的大小,而是杜绝商业的剽窃,提高商业剽窃的难度。所以如果你们注意一些大型的国外的软件厂商特别愿意中这样的方式设计数据库表。

其原理是,设计两张表,一张为真实的metadata表也就是第二张表的信息解释,这里做一个举例。

CREATE TABLE order_status_dict (status_id   SMALLINT PRIMARY KEY,status_text TEXT NOT NULL,description TEXT,is_active   BOOLEAN DEFAULT TRUE
);-- 示例插入数据:
INSERT INTO order_status_dict (status_id, status_text, description) VALUES(1, '待支付',   '用户已下单,尚未付款'),(2, '已支付',   '用户完成支付'),(3, '已取消',   '订单取消'),(4, '退款中',   '退款流程已启动'),(5, '已退款',   '退款完成'),(6, '已完成',   '订单流程已完结');
CREATE TABLE orders (
order_id         BIGSERIAL PRIMARY KEY,
user_id          BIGINT NOT NULL,
status_id        SMALLINT NOT NULL REFERENCES order_status_dict(status_id),
order_created_at TIMESTAMP NOT NULL
);CREATE INDEX idx_status_id ON orders(status_id);

在一个成熟商业软件公司,这样的设计是一个常规的设计,但我知道大部分的甲方公司的开发并没有这样的意识和开发方式。

2 字段类型缩减法

在一些大量使用float,numeric的表中,可以考虑通过附属列来进行表达比如

12.35,可以变成 列1 1235 列2 2,这个意思就是第一列的数据需要小数位2位。当然我非常理解开发同学对这样的优化的不理解,但大部分情况这样开发系统还是为了防止数据丢失,如果数据被窃取,大部分不明白其中表设计的人是无法看懂数据的真实含义。

这也是我年轻在某个公司见过的开发人员使用的一些方案来避免数据被拿走后就明白其中的含义的方案。

至于其他,建议经常去扫描POSTGRESQL中的无用索引,合并一些索引,能复合的索引就别单独建立了。

置顶

写了3750万字的我,在2000字的OB白皮书上了一课--记 《OceanBase 社区版在泛互场景的应用案例研究》

SQLSHIFT 是爱可生对OB的雪中送炭!

青春的记忆,MySQL 30年感谢有你,再见!(译)

老实人做的数据库产品,好像也不“老实” !

疯狂老DBA 和 年轻“网红” 程序员 --火星撞地球-- 谁也不是怂货  

哈呀站,OB广州开发者大会 之 “五” 眼联盟

和架构师沟通那种“一坨”的系统,推荐只能是OceanBase,Why ?

DBA 怎么变得更强-应对架构师提出高并发问题?

鸿门宴讲PostgreSQL --  被拉去央企救场一天

       美国知名大学开授China数据库理论,你没看错!

       DBA 会架构,实际案例分析--“IT流氓”得下跪

搞 PostgreSQL多才多艺的人--赵渝强 《PG数据库实战派》

追逐太阳的男人--林春 《金融数据库转型实战》

打破DBA局限:像架构师一样思考,提升你的技术价值-- 访蚂蚁金服P9 朱春茂

OceanBase 相关文章

写了3750万字的我,在2000字的OB白皮书上了一课--记 《OceanBase 社区版在泛互场景的应用案例研究》

     哈呀站,OB广州开发者大会 之 “五” 眼联盟

OceanBase 单机版可以大批量快速部署吗? YES

OceanBase 6大学习法--OBCA视频学习总结第六章

OceanBase 6大学习法--OBCA视频学习总结第五章--索引与表设计

OceanBase 6大学习法--OBCA视频学习总结第五章--开发与库表设计

OceanBase 6大学习法--OBCA视频学习总结第四章 --数据库安装

OceanBase 6大学习法--OBCA视频学习总结第三章--数据库引擎

OceanBase 架构学习--OB上手视频学习总结第二章 (OBCA)

OceanBase 6大学习法--OB上手视频学习总结第一章

没有谁是垮掉的一代--记 第四届 OceanBase 数据库大赛

OceanBase  送祝福活动,礼物和幸运带给您

跟我学OceanBase4.0 --阅读白皮书 (OB分布式优化哪里了提高了速度)

跟我学OceanBase4.0 --阅读白皮书 (4.0优化的核心点是什么)

跟我学OceanBase4.0 --阅读白皮书 (0.5-4.0的架构与之前架构特点)

跟我学OceanBase4.0 --阅读白皮书 (旧的概念害死人呀,更新知识和理念)

聚焦SaaS类企业数据库选型(技术、成本、合规、地缘政治)

OceanBase 学习记录-- 建立MySQL租户,像用MySQL一样使用OB
         MongoDB 相关文章

MongoDB “升级项目” 大型连续剧(4)-- 与开发和架构沟通与扫尾

MongoDB “升级项目” 大型连续剧(3)-- 自动校对代码与注意事项

MongoDB “升级项目” 大型连续剧(2)-- 到底谁是"der"

MongoDB “升级项目”  大型连续剧(1)-- 可“生”可不升

MongoDB  大俗大雅,上来问分片真三俗 -- 4 分什么分

MongoDB 大俗大雅,高端知识讲“庸俗” --3 奇葩数据更新方法

MongoDB 学习建模与设计思路--统计数据更新案例

MongoDB  大俗大雅,高端的知识讲“通俗” -- 2 嵌套和引用

MongoDB  大俗大雅,高端的知识讲“低俗” -- 1 什么叫多模

MongoDB 合作考试报销活动 贴附属,MongoDB基础知识速通

MongoDB 年底活动,免费考试名额 7个公众号获得

MongoDB 使用网上妙招,直接DOWN机---清理表碎片导致的灾祸 (送书活动结束)

MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模

MongoDB  双机热备那篇文章是  “毒”

MongoDB   会丢数据吗?在次补刀MongoDB  双机热备

MONGODB  ---- Austindatabases  历年文章合集

PolarDB 相关文章

MySQL 和 PostgreSQL 可以一起快速发展,提供更多的功能?

这个MySQL说“云上自建的MySQL”都是”小垃圾“

        PolarDB MySQL 加索引卡主的整体解决方案

“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!

PostgreSQL 的搅局者问世了,杀过来了!

在被厂商围剿的DBA 求生之路 --我是老油条

POLARDB  添加字段 “卡” 住---这锅Polar不背

PolarDB 版本差异分析--外人不知道的秘密(谁是绵羊,谁是怪兽)

在被厂商围剿的DBA 求生之路 --我是老油条

PolarDB 答题拿-- 飞刀总的书、同款卫衣、T恤,来自杭州的Package(活动结束了)

PolarDB for MySQL 三大核心之一POLARFS 今天扒开它--- 嘛是火

PostgreSQL 相关文章

PostgreSQL  无服务 Neon and Aurora 新技术下的新经济模式 (翻译)

PostgreSQL的"犄角旮旯"的参数捋一捋

PostgreSQL逻辑复制槽功能

PostgreSQL 扫盲贴 常用的监控分析脚本

“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!

PostgreSQL  添加索引导致崩溃,参数调整需谨慎--文档未必完全覆盖场景

PostgreSQL 的搅局者问世了,杀过来了!

PostgreSQL SQL优化用兵法,优化后提高 140倍速度

PostgreSQL 运维的难与“难”  --上海PG大会主题记录

PostgreSQL 什么都能存,什么都能塞 --- 你能成熟一点吗?

PostgreSQL 迁移用户很简单 ---  我看你的好戏

PostgreSQL 用户胡作非为只能受着 --- 警告他

全世界都在“搞” PostgreSQL ,从Oracle 得到一个“馊主意”开始
PostgreSQL 加索引系统OOM 怨我了--- 不怨你怨谁

PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!

病毒攻击PostgreSQL暴力破解系统,防范加固系统方案(内附分析日志脚本)

PostgreSQL 远程管理越来越简单,6个自动化脚本开胃菜

PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆

PostgreSQL 如何通过工具来分析PG 内存泄露

PostgreSQL  分组查询可以不进行全表扫描吗?速度提高上千倍?

POSTGRESQL --Austindatabaes 历年文章整理

PostgreSQL  查询语句开发写不好是必然,不是PG的锅

PostgreSQL  字符集乌龙导致数据查询排序的问题,与 MySQL 稳定 "PG不稳定"

PostgreSQL  Patroni 3.0 新功能规划 2023年 纽约PG 大会 (音译)

PostgreSQL   玩PG我们是认真的,vacuum 稳定性平台我们有了

PostgreSQL DBA硬扛 垃圾 “开发”,“架构师”,滥用PG 你们滚出 !(附送定期清理连接脚本)

DBA 失职导致 PostgreSQL 日志疯涨

MySQL相关文章

青春的记忆,MySQL 30年感谢有你,再见!(译)

MySQL 8 SQL 优化两则 ---常见问题

MySQL SQL优化快速定位案例 与 优化思维导图

"DBA 是个der" 吵出MySQL主键问题多种解决方案

MySQL 怎么让自己更高级---从内存表说到了开发方式

MySQL timeout 参数可以让事务不完全回滚

MySQL 让你还用5.7 出事了吧,用着用着5.7崩了

MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验

用MySql不是MySQL, 不用MySQL都是MySQL 横批 哼哼哈哈啊啊

MYSQL  --Austindatabases 历年文章合集

临时工访谈系列

没有谁是垮掉的一代--记 第四届 OceanBase 数据库大赛

ETL 行业也够卷,云化ETL,ETL 软件不过了

SQL SERVER 系列

SQL SERVER维保AI化,从一段小故事开始

SQL SERVER 如何实现UNDO REDO 和PostgreSQL 有近亲关系吗

SQL SERVER 危险中,标题不让发,进入看详情(译)


http://www.hkcw.cn/article/FnNIPLaNbg.shtml

相关文章

商家称六一表演用鞋被批量退货退款 商家贴标防“薅羊毛”

去年“六一”儿童节期间,“商家投诉表演服被大量退货”的话题频繁登上热搜。今年临近“六一”,不少商家在社交平台上分享防范技巧,山东菏泽的周女士就是其中之一。从事童装生意10年的周女士透露,去年某学校购买了300多套演出服,节后全部退回。退回的衣物使用痕迹严重,有的…

力扣每日一题——蛇梯棋

目录 题目链接:909. 蛇梯棋 - 力扣(LeetCode) 题目描述 解法一:BFS坐标转换 Java写法: C写法: 运行时间 时间复杂度和空间复杂度 总结 题目链接:909. 蛇梯棋 - 力扣(LeetCod…

seq2seq 视频截图

【官方双语】编码、解码神经网络,一个视频讲清楚,seq2seq模型_哔哩哔哩_bilibili 【深度学习 搞笑教程】33 Seq2Seq网络 Attention注意力机制 | 草履虫都能听懂 零基础入门 | 持续更新_哔哩哔哩_bilibili 【深度学习】seq2seq模型/Encoder-Decoder模型及…

俄乌会谈前夕 飞出数只 “黑天鹅” 谈判前景蒙阴影

俄乌第二轮谈判定于6月2日在伊斯坦布尔的契拉昂宫举行。这座宫殿历史可追溯至奥斯曼土耳其时期,目前作为酒店使用。关于本次谈判,俄罗斯代表团已抵达土耳其,由总统助理梅金斯基率领。俄方表示将携带一份备忘录草案和其他停火提议。俄方希望在新一轮谈判中讨论和平协议备忘录…

北京警方现场查扣6辆,专治这种车主 严打非法改装噪音扰民

近期,北京市大兴区南海子公园周边的牡丹园南广场区域夜间常有非法改装摩托车聚集。这些车辆不仅存在安全隐患,巨大的轰鸣声也严重干扰了周边居民的正常休息,引发多起投诉。对此,大兴交通支队开展了改装摩托车专项整治行动,对非法改装、噪音扰民等违法行为进行精准打击。5月…

巴黎圣日耳曼包揽2024/25赛季欧冠最佳阵容 登贝莱获最佳球员

巴黎圣日耳曼前锋登贝莱当选2024-25赛季欧冠最佳球员。在本赛季的欧冠比赛中,他代表巴黎出场15次,其中13次首发,共打入8球并送出6次助攻。在决赛中,登贝莱贡献了2次关键助攻,帮助球队以5-0大胜国际米兰,赢得了队史首座欧冠冠军。责任编辑:zhangxiaohua

对亡人事故负有责任 北京建元筑和建筑装饰工程有限公司被罚50万 安全生产法处罚

北京建元筑和建筑装饰工程有限公司因生产安全事故被处罚。该公司法定代表人为刘振包,统一社会信用代码为91110113MA00ECX81L。2025年3月14日10时许,在密云新北路29号院棚户区改造项目2#楼北侧施工道路中段发生一起车辆伤害事故,导致1人死亡。根据《北京建元筑和建筑装饰工程…

库迪把瑞幸逼到什么份上了? 6.9元限时优惠应战

5月30日,端午节前最后一个工作日,许多人早晨打开瑞幸小程序时发现,原本熟悉的“9.9”元咖啡突然变成了“6.9”元。虽然减的钱不多,但大家还是觉得挺划算的,“本来以为瑞幸九块九已经吸引不了我了,但它都六块九了就来一杯吧”。这一消息迅速传播开来,“瑞幸降价”的话题很…

只办婚礼不领证,年轻人开始一种很新的「婚姻」 爱情与自由的新选择

李晴和男友爱情长跑了9年,多次讨论过结婚生小孩的问题。2019年,男友家决定给他们买婚房,但由于男友征信问题,房子写在了李晴名下。李晴担心如果两人分手,房子会引发纠纷,她向男友坦白自己没有生育打算,并提出分手。男友表示他也不打算要孩子,两人签了协议,约定如何处理…

下一轮节假日在4个月后 国庆中秋连放8天

今天是端午节假期的最后一天,大家或许已经在期待下一次休假。根据国务院办公厅关于2025年部分节假日安排的通知,今年下一次长假将在4个月后的国庆节和中秋节期间。届时,国庆节和中秋节将合并放假8天。责任编辑:zhangxiaohua

嵌入式学习笔记 - FreeRTOS v9.0.0 与v10.0.1不同版本占用资源对比,以及TOTAL_HEAP_SIZE设置大小

一 资源占用对比 以下为用示例对比freeRTOS v9.0.0版本以及v10.0.1版本占用资源的境况,两者均在运行完全相同的任务包括任务内容与数量的情况进行对比,任务的创建均使用静态内存方式创建,每个任务的任务堆栈均设置相同大小,并且f…

装有87万元的行李箱赶高铁遗失 20分钟巨款物归原主

端午假期期间,深圳北站迎来客流高峰,单日发送和到达旅客突破50万人次。在这繁忙的出行场景中,一个装有87万元现金的行李箱与主人意外分离。5月31日9时41分,深圳北站派出所的两名公安干警在巡视候车室时发现了一个无人认领的白色行李箱,立即告知车站客运车间工作人员。工作…

day42python打卡

知识点回顾 1.回调函数 2.lambda函数 3.hook函数的模块钩子和张量钩子 4.Grad-CAM的示例 作业:理解下今天的代码即可 Grad-CAM 在深度学习中,我们经常需要查看或修改模型中间层的输出或梯度。然而,标准的前向传播和反向传播过程通常是一个…

一纸规划让沉寂多年高庙村热闹起来 乡村焕发新生机

从空中俯瞰紧邻长寿湖的长寿区石堰镇高庙村,建设正如火如荼推进。5月21日,日上三竿,刚从地里摘完蔬菜的孔祥辉回到家里,发现92岁的婆婆没在屋里。“啊,没在!准是去湖边了。最近兴致高,天气这么大都要去。”孔祥辉不禁说道。孔祥辉是长寿区石堰镇高庙村村民,她口中的“湖…

中国女排世联赛北京站名单揭晓 阵容公布引发期待

北京时间6月2日,中国排球协会公布了中国女排参加世界联赛北京站的名单。主攻位置上,队伍选择了吴梦洁、庄宇珊、唐欣和董禹含;副攻则由王媛媛、万梓玥、单琳倩、陈厚羽以及王奥芊组成;接应方面,龚翔宇担任队长,杨舒茗和范泊宁也入选了名单;二传位置上是邹佳祺、殷小岚和…

北京一男子端午节独爬野山被困,还执意自己找路!27人连夜冒雨搜山 自信过度险酿祸

5月31日端午节,在北京房山一处野山中,一名男子登山迷路。他联系警方询问下山路,警方随即联动了房山蓝天救援队。晚上8点多,当救援队员试图获取更多信息时,该男子表示只想问路,并拒绝了救援队的帮助,坚持自己下山。尽管如此,为了确保他的安全,救援队还是启动了救援程序…

如何在 Windows 11 中添加环境变量

在 Windows 11 中,可以通过图形用户界面轻松设置环境变量 (env)。Windows 或其他操作系统需要环境变量来准确了解重要文件的存储位置。这些位置在每台计算机上可能会有所不同。对于大多数 Windows 用户而言,系统通常位于 C:\Windows\ 文件夹中,而应用程序则一般情况下默认是…

张家界溶洞垃圾已打捞2.7吨 排污事件引发关注

近日,有网友反映张家界市慈利县一处天然溶洞被人为排污,导致溶洞受到污染。相关话题引起了广泛关注。据慈利县融媒体中心6月1日发布的最新视频,经过7天的努力,清理打捞杨家坡溶洞垃圾2.7吨。相关视频显示,溶洞内的垃圾正在被装袋并使用吊机吊出,旁边已经堆放了大量袋装好…

美国卡车侧翻 2.5亿只蜜蜂“出逃” 养蜂人紧急救援

当地时间5月30日,美国西北部的华盛顿州发生了一起车祸。一辆卡车后的拖车侧翻,导致约2.5亿只蜜蜂飞出。有关部门随即发布通知,提醒公众提高警惕,小心被蜇。车祸发生后,附近的养蜂人纷纷赶往现场帮忙,收集从车上滚落的蜂箱并妥善安置。应急部门也封闭了该区域的多条道路,…

北京:男子端午节爬野山迷路,还执意自己找路!27人冒雨搜山救援 最终成功救出

5月31日端午节,在北京房山一处野山中,一名男子登山迷路,但他不想麻烦救援队,坚持要自己摸索下山。男子曾给警方打电话询问下山道路,警方随后联系了房山蓝天救援队。晚上8点多,当救援队员询问男子详细信息时,他却表示只想问问路,并拒绝了救援队员的帮助。尽管被困男子未…