postgresql使用规范解读
表设计规范
1、建议能使用小字节数类型,就不要用大字节数类型
2、建议能用varchar(N)、text就不用char(N);
3、建议使用default NULL,而不用default '';
4、建议使用NUMERIC(precision,scale)来存储货币金额和其它要求精确计算的数值,而不使用
real,double precision
5、如果有国际货业务的话,建议使用timestamp with time zone(timestamptz),而不用
timestamp without time zone,避免时间函数在对于不同时区的时间点返回值不同
建议建表时COLUMN加上COMMENT,便于后续了解业务及维护:
6、频繁更新的表建议设定适当的fillfactor,如85%,预留15%空间供hot更新使用
7、避免使用触发器,会使数据处理逻辑复杂,不便于调试
8、表设计建议加上增量设计,以方便数据获取、统计等
9、频繁访问的大表进行分区设置,一般超过千万级的宽表,或大于8GB的表可以考虑分区
10、建议设置命名规范,方便区分各个对象,建议小写字母、数字、下划线,统一简拼或是英
文,不建议拼音、英文混用
表名 t_
索引名 i_
视图 v_
函数 fun_
临时表或备份表加上关键字tmp、bak
索引设计规范
1、在选择性好的字段上创建索引
2、如使用逻辑外键,建议在逻辑外键上创建索引
3、优先考虑where条件中及order by字段添加索引
4、对于where条件中多个字段and条件的高频sql,可以参考数据分布情况创建多字段组合索引
5、对于固定条件且数据占比低的高频sql,可以创建partial index
6、对于经常使用表达式作为查询条件的sql,可以使用表达式索引,正常索引不会起作用
研发规范
1、避免使用select *,枚举所需要的字段
2、统计数量统一使用count(*),不使用count(常量),count(列名)
3、判空使用is null、is not null,不用=、!=判空
4、避免join过多表,union过多表
5、实现分页查询逻辑时,如果count为0,则直接返回,避免执行后续的分页语句
6、游标使用后要关闭、释放
7、应用程序开启autocommit,避免程序自动begin事务后不做任何操作
8、高并发应用场景使用数据库连接池
9、应用正确处理数据类型,避免在数据库中进行隐式转换
10、避免向客户端返回大量数据
11、避免单个事务过大、过长、过于复杂,将单个事务中多条sql操作分解、拆分,或者放到不同
的事务里,每个事务粒度尽可能小,这样可以尽量减少资源lock,检查锁阻塞、死锁的产生
12、大批量的数据入库时,使用copy替代insert,可以提高写入速度
13、避免频繁count大表,实时性要求不高的场景,可以定期count,并将count结果缓存使用
14、建议对报表类的或生成基础数据的查询,使用物化视图(MATERIALIZED VIEW)定期固化数据
快照,避免对多表(尤其多写频繁的表)重复跑相同的查询。PostgreSQL中物化视图支持并发更
新:REFRESH MATERIALIZED VIEW CONCURRENTLY。原理和优缺点与index CONCURRENTLY
类似,即以时间来换取锁,并发刷新的速度会比非CONCURRENTLY慢,但后者会阻塞其他从该物
化视图读数据的请求。
运维规范
1、ddl操作设置锁等待,防止雪崩
2、删除全表使用truncate,不使用delete
3、修改数据时先select确认范围,使用事务控制提交或回滚
4、在线创建索引使用CONCURRENTLY关键字,避免阻塞dml
5、数据库设置复杂密码,应用不使用超级用户,控制账号明确权限,不同应用共用数据库时分配
多个账号
6、发生主备切换后,新的主库在开放给应用程序使用前,建议使用pg_prewarm预热之前的主库
shared buffer里的热数据
postgresql使用规范解读的更多相关文章
- PostgreSQL 源码解读 node的模拟实现
node的实现是PostgreSQL的查询解析的基础,实现的关键是两个宏,makeNode和newNode.其他节点继承自Node节点,如果增加新的结构体,需要添加NodeTag中添加对应的枚举值 ...
- MySQL数据库25条规范解读
一.基础规范 (1)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省空间(由于移动设备原因最好使用utf8mb4) (2)禁止使用存储过程.视图.触发器.Event 解读:高并发大数据 ...
- MySQL30条规范解读
转载自:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959906&idx=1&sn=2cbdc66cfb ...
- 中国银联mPOS通用技术安全分析和规范解读
mPOS是近年出现并得到迅速发展的一种新型受理产品,不少机构和生产企业进行了各种形式的试点. 因为mPOS引入了手机.平板电脑等通用智能移动设备.并通过互联网进行信息传输.因此其安全特点与传统银行卡受 ...
- PolarDB PostgreSQL 架构原理解读
背景 PolarDB PostgreSQL(以下简称PolarDB)是一款阿里云自主研发的企业级数据库产品,采用计算存储分离架构,兼容PostgreSQL与Oracle.PolarDB 的存储与计算能 ...
- ULID规范解读与实现原理
前提 最近发现各个频道推荐了很多ULID相关文章,这里对ULID的规范文件进行解读,并且基于Java语言自行实现ULID,通过此实现过程展示ULID的底层原理. ULID出现的背景 ULID全称是Un ...
- js 强转规范解读
js的强转是我们很容易遇到坑的一个地方 比如 == 会产生很有意思的事情(使用===还是最佳实践的) 或者+new Date()一个当前的数字时间戳 这里面都涉及到强转 下面分享下学习强转的过程 ...
- 微信小程序 登录流程规范解读
一. 官方登录时序图 二. 简单理解 这里仅按照官方推荐的规范来 0. 前置条件 一共有三端: - 微信小程序客户端 - 第三方服务器端(自己搭建) - 微信服务器端 1. 客户端获得code,并将c ...
- ECMAScript规范解读this
在<JavaScript深入之执行上下文栈>中讲到,当JavaScript代码执行一段可执行代码(executable code)时,会创建对应的执行上下文(execution conte ...
随机推荐
- 2.1 Spring5源码编译
一. 准备工作 1. . 编译环境 maven jdk8 idea 2. 编译版本: SpringV5.2.7RELEASE+GradleWapper+jdk1.8.0_131编译 二. 源码下载 g ...
- java8--排序
排序的传统的写法是: Collections.sort( SortTest.users, new Comparator<User>() { @Override public int com ...
- Object类:又回到最初的起点
Object类大概是每个JAVA程序员认识的第一个类,因为它是所有其他类的祖先类.在JAVA单根继承的体系下,这个类中的每个方法都显得尤为重要,因为每个类都能够调用或者重写这些方法.当你JAVA学到一 ...
- robotframework获取Token
公司做接口自动化,但是其他接口调用都需要传入token,所以首要目标是把token读取出来. 需要清楚以下内容: 1.登录使用post请求 2.https协议,且登录后需手工验证SSL证书,默认处于不 ...
- Oracle学习(三)SQL高级--表结构相关(建表、约束)
一.建表语句 CREATE DATABASE(创建数据库) --创建数据库 create database 数据库名字; CREATE TABLE(创建表) --创建表 CREATE TABLE 表名 ...
- 一分钟理解Redo Undo
数据库中有一种特殊的"日志文件"叫 Redo(重做) Undo(撤销),传统意义上的日志文件是记录系统运行状态的,主要用于系统工程师或者程序员排错.而 Reod/Undo 文件是数 ...
- 有没有异常处理翻车过的,绩效还被打了C
絮叨 因为程序异常处理问题,就在前几天龙叔的服务挂了几秒钟. 完了,马上季度末打绩效,竟然在这里翻车了,心如刀绞啊. 虽然没有影响到用户体验,但是找到问题并解决掉问题是工程师日常追求之一. 作为一个优 ...
- GameObject的==的一个坑和一点GameObject的内部构造
一切都是因为==,才有了这篇博客 目录 测试 结果和分析 总结 测试 先放一段unity的一个普通的脚本 using UnityEngine; public class UnityEngineObje ...
- 基于gis的系统开发,程序运行出现问题 ArcGIS product not specified.You must first bind to an ArcGIS version prior to using any ArcGIS components.
在之前初始化的时候添加下面的一行代码:ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);还需要添加一个引 ...
- Django-发送注册、忘记密码邮件验证-send_mail
用户邮箱注册.发送验证码流程图 那,如何解决? 1. setting配置邮箱参数 # 邮箱设置,需要在邮箱中开启smtp服务 # 提供服务的主机域名 EMAIL_HOST = 'smtp.163.c ...