MYSQL数据库开发规范
命名规范
- 数据库名、表名、字段名都使用小写字母
- 单词以前使用“_”来链接,不使用驼峰命名法
- 长度禁止超过48个字符
- 不准使用MySQL关键字
- 常规库以db_开头,常规表以tbl_开头
- 临时库,临时表以 tmp_ 为前缀,以日期为后缀
- 备份库,备份表以 bak_ 为前缀,以日期为后缀
基础规范
- 使用InnoDB存储引擎
- 一概采用UTF-8编码
- 表和属性必须填注释
- 单表数据量控制在1000W如下
- 禁止在生产库作压力测试
- 禁止从测试、开发环境直接生产库
库表设计
- 生产环境禁止使用分区表
- 拆分大字段及访问频率低的字段,分离冷热数据
- Hash分表时,表后缀必须是10进制数
- 按日期分表时,年份使用2位而不使用4位
- 采用合适的Sharding策略,userId、date、province、
- 尽可能不使用外键,由程序来保证约束 有额外开销、逐行操做、高并发时容易死锁
- 单库表数量不超过300张
- 单表字段数不超过50个
- 单行不超过200字节
字段规范
- 尽量不使用TEXT,CLOB,BLOB类型的字段: 对于大文本存储,可使用varchar类型,varchar(65535) -> 64K 若是必定要使用,能够单独拆成一个表来使用
- 尽可能不在数据库中保存图片,文件等大字段
- 涉及金额的字段一概使用 Decimal类型,绝对不容许使用 double/float 类型
- 使用合适的数据类型: tinyint(1),smallint(2),mediumint(3),int(4),bigint(8),float(4),double(8),decimal(总长度,小数部分长度)
- 除非NULL有特殊含意,全部字段不准为空: 很难进行查询优化、NULL列加索引需额外空间、含NULL复合索引无效、应用开发容易出空指针异常
- 时间可使用datetime类型
- 不要使用枚举类型
索引规范
- 单张表索引数量最好不超过5个
- 单个索引中字段数不超过5个
- 对字符串类型的字段使用前缀索引,前缀索引长度不超过8个字符
- 表必须有主键,主键不该该更新 禁止使用UUID,MD5,Hash结果做为主键。 推荐使用独立于业务的Auto_increment字列,或全局ID生成器做代理主键 数字型相比字符串型索引:高效、查询快、占空间小
- 重要的SQL必须被索引 where条件中的字段、order by、group by、distinct 字段、多表join的字段
- 区分度大的字符放在前面
- 核心SQL优先考虑覆盖索引
- 避免冗余和重复索引
- 不在低区分度字段建索引,如:性别,车型,车款
- 不要在索引字段进行数学运算和函数运算,索引会失效
- 查询时,不使用%前导的查询,如: like '%cd'
- 尽可能不使用负向查询,如:not in / not like / <> / != 缘由:全表扫描
SQL设计
- 使用预编译语句和参数形式,不手动拼接SQL字符串,1)提升性能 2)防止SQL注入
- 充份利用索引,尤为前缀索引
- 避免使用存储过程、触发器、UDF、Events等 缘由:1)下降业务复杂度,全部业务处理都不放在数据库进行,只让数据库作最擅长的事情;2)存储过程出Bug很差调试
- 避免大表Join
- 避免在数据库中进行数学运算 缘由:1)数据库不擅长作数学运算和逻辑判断;2)可能会使索引失效
- 减小与数据库的交互次数 INSERT ... ON DUPLICATE KEY UPDATE REPLACE INTO、INSERT IGNORE 、INSERT INTO VALUES(),(),() UPDATE … WHERE ID IN(10,20,50,…)
- 合理使用分页 限制分页展现的页数,如:页面上只显示有100页数据 只能点击上一页、下一页,不能随意跳转页号 采用延迟关联:不直接关联两张大表,而是先查一张表,再用主键从另外一张表中查数据
- 拒绝大SQL,将大SQL拆分红小SQL 简单SQL的缓存命中率高;1条SQL只能使用一个核,把大SQL拆成多个小SQL能够充份利用多核CPU;减小锁表时间
- 拒绝大事务,事务使用原则: 即开即用,用完即关 与事务无关的操做放在事务外面 不破坏一致性的前提下,使用多个短事务替代长事务
- 拒绝大批量
- 使用
in
来代替 or
,in
中的值不准超过200个 对于使用or的SQL,若是or的条件不是同一个字段,可使用 union 来优化
- 禁止使用 order by rand(),除非数据量很是少
- 在上线前,使用 explain 来分析SQL的执行计划
- 使用 union all ,不使用 union
- 尽可能不使用 select * 来执行查询,缘由: 消耗网络带宽
- 实时统计计数使用缓存,双向更新凌晨跑基准;非实时在数据仓库统计
- 高效分页:使用查询条件减小数据集 select * from table where id>=12345 limit 10;
- 使用同数据类型在where条件中进行列值比较 数字对数字、字符对字符 数值列与字符串比较:同时转为双精度 字符串列与数字比较:字符串列转数值,而且不会使用索引
- group by 默认会排序,若是不须要对分组结果排序,可使用 order by null,这样就不会对结果排序了。
select phone, count(*) from post group by phone order by null
行为规范
- 批量导⼊、导出数据必须提早通知DBA协助观察
- 禁⽌在线上从库执⾏后台管理和统计类查询
- 禁⽌有super权限的应⽤程序帐号存在
- 产品出现⾮数据库致使的故障时及时通知DBA协助排查
- 推⼲活动或上线新功能必须提早通知DBA进⾏流量评估
- 数据库数据丢失,及时联系DBA进⾏恢复
- 对单表的屡次alter操做必须合并为⼀次操做
- 不在MySQL数据库中存放业务逻辑
- 重⼤项目的数据库⽅案选型和设计必须提早通知DBA参与
- 对特别重要的库表,提早与DBA沟通肯定维护和备份优先
- 不在业务⾼峰期批量更新、查询数据库
- 提交线上建表改表需求,必须详细注明全部相关SQL语句
欢迎关注本站公众号,获取更多信息