MySQL数据库开发规范

March 07, 2017

Tags:mysql

最近发现很多开发新人甚至还有一些Web开发工作几年的老人对MySQL缺乏一定的认识,在项目中经常因考虑不周产生设计问题和生产环境问题。所以综合各类资料整理一份“开发规范”,供大家参考。不足指出还请各位多多指教。

MySQL数据库开发规范

总原则

  • 数据库只是数据库,不要将MySQL变成计算器
  • 合并写入分多次提交,降低瞬间压力
  • 读写分离,缓解线上库压力
  • 本地数据写队列,异步提交防止意外丢失数据
  • 合理拆分:大型数据字段独立拆分,冷热数据分离
  • 专用统计库,分离线上/线下应用查询
  • 最低授权,不开放/不使用非必要权限

基础规范

  • 使用InnoDB,尽量不用MyISAM
  • 必须使用UTF8或UTF8MB4编码
  • 尽量避免使用视图、存储过程、触发器、Event
  • 禁止存储大照片、大型数据文件
  • 开发环境和生产环境尽可能保持一致
  • 不对InnoDB表进行在线实时统计

设计规范

  • 简单至上,如:INT/TIMESTAMP记录时间,而非DATETIME;IPv4地址用INT,而不是CHAR(15)
  • 字段长度足够即可
  • 单表列数量尽力控制为最小
  • 表必须有主键,例如自增主键
  • 高并发系统尽量避免使用外键,外键完整性约束,可在应用程序中控制
  • 冗余反向字段便于反向检索
  • 避免使用TEXT、BLOB
  • 禁止使用小数存储高精度数值,例如货币
  • 必须使用VARCHAR存储电话号码
  • 必须把字段定义为NOT NULL且提供默认值

索引使用规范

  • 主键/唯一索性能引优于普通索引
  • 组合索引或许比普通索引更合适
  • 建立组合索引,必须把区分度高(值种类多的)的字段放在最前面
  • 不在基数(cardinality)小的列上建索引
  • 长字段使用部分索引,而非全部
  • 常用检索、排序字段,需要创建索引
  • 过度索引会带来灾难
  • 禁止在频繁更新的字段上创建索引

SQL查询规范

  • 禁止使用SELECT *,只查询必要的字段
  • 简单SQL比复杂SQL高效
  • 尽量减少使用复杂表连接
  • 禁止使用INSERT INTO xxx VALUES(xxxx),必须显式指定插入的列属性
  • 尽量不用子查询
  • 留意查询条件加引号可能会导致的类型转换
  • 禁止在WHERE条件的属性上使用函数
  • 禁止负向查询(如!=、<>、NOT、NOT IN、NOT LIKE等)
  • 禁止使用%开头的模糊查询
  • 应用程序必须捕获因查询引发的异常,并做好相应防御性处理

· EOF ·