表设计规范
1、建议能使用小字节数类型,就不要用大字节数类型
2、建议能用varchar(N)text就不用char(N)
3、建议使用default NULL,而不用default ''
4、建议使用NUMERIC(precisionscale)来存储货币金额和其它要求精确计算的数值,而不使用
realdouble 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_
临时表或备份表加上关键字tmpbak


索引设计规范
1、在选择性好的字段上创建索引
2、如使用逻辑外键,建议在逻辑外键上创建索引
3、优先考虑where条件中及order by字段添加索引
4、对于where条件中多个字段and条件的高频sql,可以参考数据分布情况创建多字段组合索引
5、对于固定条件且数据占比低的高频sql,可以创建partial index
6、对于经常使用表达式作为查询条件的sql,可以使用表达式索引,正常索引不会起作用


研发规范
1、避免使用select *,枚举所需要的字段
2、统计数量统一使用count(*),不使用count(常量),count(列名)
3、判空使用is nullis not null,不用=!=判空
4、避免join过多表,union过多表
5、实现分页查询逻辑时,如果count0,则直接返回,避免执行后续的分页语句
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慢,但后者会阻塞其他从该物
化视图读数据的请求。


运维规范
1ddl操作设置锁等待,防止雪崩
2、删除全表使用truncate,不使用delete
3、修改数据时先select确认范围,使用事务控制提交或回滚
4、在线创建索引使用CONCURRENTLY关键字,避免阻塞dml
5、数据库设置复杂密码,应用不使用超级用户,控制账号明确权限,不同应用共用数据库时分配
多个账号
6、发生主备切换后,新的主库在开放给应用程序使用前,建议使用pg_prewarm预热之前的主库
shared buffer里的热数据



 

posted on 2020-10-21 19:34  黑洞中的奇点  阅读(545)  评论(0编辑  收藏  举报