[TOC]
#Mysql开发规范
##命名规范
- 库名、表名、字段名必须使用小写字母,并采用下划线分割
- 库名、表名、字段名禁止超过32字字符。须见名之意
- 库名、表名、字段名禁止使用Mysql保留字
- 临时库、表名必须以tmp为前缀,并以日期为后缀
- 备份库、表名必须以bak为前缀,并以日期为后缀
create table user ...tmp_user_20160606bak_user_20160606
##基础规范
- 使用innodb存储引擎
- 表字符集使用utf-8
- 所有表必须添加注释
- 单表数据量控制在5000w以内
- 不在数据库中存储图片、文件等大数据
- 禁止在线上做数据库压力测试
##库表设计
- 禁止使用分区表
- 拆分大字段和访问频率低的字段,分离冷热数据
- 用hash进行散表,表名后缀使用十进制数,下标从0开始
- 按日期时间分表需符合YYYY[MM][DD][HH]格式
- 采用合适的分库分表策略。例如十库百表等
##字段设计
- 所有字段均定义为not null
- 尽量不使用TEXT、BLOB类型
- 使用decimal代替float和double存储精确浮点数
- 使用tinyint代替enum类型
- 使用unsigned存储非负整数
- 使用timestamp存储时间
- 使用int存储时间戳
- 使用int存储ip
- 禁止在数据库存储明文密码
##索引规范
- 单张表索引数量不超过5个
- 单个索引中的字段数不超过5个
- 前缀索引长度不超过8个字符
- 区分度最大的字段放在前面。如:联合索引
- 尽量不选择字符串列
- 不使用外键
- 不使用更新频繁的列
- 不使用UUID MD5 HASH
- 不使用%前导的查询,如like "%ab"
- 不使用负向查询,如not in/like
- 不在低基数列上建立索引,例如:性别
- 不在索引列进行数学运算和函数运算
##SQL设计
- 充分利用前缀索引,例如:最左前缀
- 不使用select *
- 不能同时用到两个范围条件
- 不使用存储过程、触发器、视图等
- 不使用大表join
- 不使用数学运算和逻辑判断
- 不使用order by rand()
- 不使用单条sql语句同时更新多个表
- 多使用insert ... on duplicate key update
- 多使用replace into、insert ignore、insert into values(),(),()
- 多使用update ... where id in(10,20,50,...)
- 使用in代替or, in的值不超过1000个
- 使用explain诊断,避免生成临时表
- 使用union all而不是union
###goodselect * from profiles where sex='M' order by rating limit 10;select * from profiles inner join (selectfrom profiles where x.sex='M'order by rating limit 100000,10) as x using ( );###badselect * from profiles where sex='M' order by rating limit 100000,10;
##行为规范
- 禁止有super权限的应用程序账号存在
- 不在业务高峰其期批量更新、查询数据库
- 提交线上建表改表需求,必须详细注明所有相关sql语句