# MySQL开发规范
1. 命名规范
2. 基础规范
3. 字段设计
4. 索引规范
5. SQL设计
6. 库表设计
### 命名规范
- 数据库名、表名、字段名必须使用小写字母
- 数据库名、表名、字段名禁止超过32个字符
- 数据库名、表名、字段名必须见名知意
- 数据库名、表名、字段名的命名需要与业务、产品等相关联
- 数据库名、表名、字段名禁止使用MySQL保留字(保留字列表:https://dev.mysql.com/doc/refman/5.6/en/keywords.html)
- 临时数据库、表的名字必须以tmp作为前缀,如tmp_distributor、tmp_february_promote等
- 备份数据库、表的名字必须以bak作为前缀,如bak_accounts_users、bak_financeproducts_users等
- 触发器名必须以tri作为前缀,如tri_experiencesend_6666等
- 存储过程名字必须以proc作为前缀,如proc_raisetask等
- 事件名字必须以e作为前缀,如e_distributor等
- 视图名字必须以v作为前缀,如v_accounts_users等
### 基础规范
- 全部使用innodb存储引擎
- 表字符集统一使用UTF8字符集
- 所有字段和表用途都需要添加注释
- 对同一个表的多次alter操作必须合并为一次操作
- 数据库的密码强度要求是18位数字字母字符混合密码
- 禁止在数据库中存储图片、文件等大数据
- 每张表数据量建议控制在500w以内
### 库表设计
- 禁止使用分区表
- 尽量将大字段、访问频率低的字段拆分到单独的表中存储,分离冷热数据
- 采用合适的分库分表策略。例如十库百表等
### 字段设计
- 所有字段均定义为NOT NULL
- 用decimal代替float和double存储精确却浮点数.例如与金额相关的数据
- 强烈建议使用tinyint来代替enum类型
- 尽可能不使用text,blob类型
- 使用尽可能小的VARCHAR类型字段。VARCHAR(N)中的N表示字符数而非字节数
- 存储年使用YEAR类型。存储日期使用DATE类型。存储时间(精确到秒)建议使用 TIMESTAMP或者DATETIME类型。
### 索引相关规范
- 索引名必须全部使用小写
- 表必须有主键,推荐使用数字整形类型id int unsigned作为自增主键
- 非唯一索引按照“idx_字段名称[_字段名称]”进行命名。例如idx_name
- 唯一索引按照“uniq_字段名称[_字段名称]”进行命名。例如uniq_name
- 组合索引建议包含所有字段名,过长的字段可以采用缩写形式
- 不在选择性低的列上建立索引。例如性别等
- 选择选择性高的列建立索引.组合索引中,选择性高的列放在最前面
- 不对过长的varchar字段建立索引。考虑前缀索引,或者添加CRC32或MD5伪列并建立索引
- 单表求MIN/MAX函数操作的字段上建立索引
### SQL设计
- 禁止使用外键
- 拆分复杂SQL为多个SQL,避免大事务
- 获取大量数据时,分批获取数据,每次获取数据少于2000条,结果集应小于1M
- 避免使用join和子查询。必要时推荐使用join代替子查询
- 禁止在MySQL的where条件左边对字段进行数学运算和函数运算
- 禁止单条SQL语句同时更新多个表
- 禁止使用%前导查询,例如 like '%ABC',会导致SQL语句不走索引
- 禁止使用负向查询,例如 not in、!=、not like等
- 避免使用update...limit以及delete...limit语句