[规范]库表规范汇总
表设计
ID字段作为自增主键,禁止在非事务内作为上下文作为条件进行数据传递
禁止使用外键。
业务逻辑规则在应用层进行实现,减少外键约束检查和变更带来的性能问题,对未来扩展预留空间
多表中的相同列,必须保证列定义一致
国内表默认使用InnoDB,表字符集默认使用gbk,国际默认使用utf8的表
单表一到两年内数据量超过500w或数据容量超过10G考虑分表,且需要提前考虑历史数据迁移或应用自行删除历史数据
流水数据必须提前分表,避免后续数据迁移工作,分表数据必须建立uuid字段,进行全局唯一标识用来全局防重,可以使用分布式id,其他情况还可以结合业务类型bizType,用户pin等进行拼接防重
单条记录大小禁止超过8k(列长度(中文)2(gbk)/3(utf8)+列长度(英文)1)
日志类数据不建议存储在MySQL上,优先考虑Hbase或OB,如需要存储请找DBA评估使用压缩表存储
字段设计
表必须定义主键,默认为id,整型自增,一般设置为bigint类型
结合聚簇索引B+Tree寻址逻辑,充分利用顺序io磁盘存储,单次load内存数据多且io交互少,带来的高性能。目前线上数据库都是SSD固态硬盘,可以忽略寻址损耗,但是也要知其所以然
表被索引列必须定义为not null,并设置default值。
减少空值带来的验证判断
禁止使用float、double类型,建议使用decimal或者int替代
禁止使用blob、text类型保留大文本、文件、图片,建议使用其他方式存储(TFS/SFS),MySQL只保存指针信息
禁止使用varchar类型作为主键语句设计
数值精度字段采用decimal字段进行存储,一般银行业务保留小数点后6位,结合Java中的BigDecimal匹配使用,注意BigDecimal除不尽的情况,根据业务需要进行ROUNDING_MODE设定
表必须包含createTime和updateTime字段,即表必须包含记录创建时间和修改时间的字段
规范要求修改时间字段必须设置为updateTime字段,数据部门,dba会对该字段进行识别来进行数据抽取、变更判断等,不要设置成其他字段名称
且必须配置 updateTime
datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’
索引设计
语句设计
数据更新建议使用二级索引先查询出主键,再根据主键进行数据更新
避免隐式转换带来的索引失效,禁止使用非同类型的列进行等值查询
动态SQL注意where条件为空的情况。
update语句必须有必填项进行更新操作,防止全量更新,或者兜底使用错误语句进行拼接让SQL失效
不允许使用物理删除,对表数据进行逻辑删除。
防止存储数据频繁移动重建,非顺序插入带来的性能消耗,避免存储磁盘产生页分裂,增加读取数据的IO次数消耗
避免函数计算带来的索引失效问题
其他
禁止使用:存储过程、触发器、函数、视图、事件等MySQL高级功能
禁止使用跨库查询
禁止使用子查询,建议将子查询转换成关联查询
禁止核心业务流程SQL包含:计算操作、多表关联、表遍历case when等复杂查询,建议拆分成单表简单查询
varchar长度设计需要根据业务实际需要进行长度控制,禁止预留过长空间。例如status使用varchar(128)进行存储