文档章节

MYSQL数据库开发规范

古城痴人
 古城痴人
发布于 2016/06/30 18:44
字数 1665
阅读 78
收藏 18
点赞 1
评论 0

命名规范

  1. 数据库名、表名、字段名都使用小写字母
  2. 单词之前使用“_”来连接,不使用驼峰命名法
  3. 长度禁止超过48个字符
  4. 不许使用MySQL关键字
  5. 常规库以db_开头,常规表以tbl_开头
  6. 临时库,临时表以 tmp_ 为前缀,以日期为后缀
  7. 备份库,备份表以 bak_ 为前缀,以日期为后缀

基础规范

  1. 使用InnoDB存储引擎
  2. 一律采用UTF-8编码
  3. 表和属性必须填注释
  4. 单表数据量控制在1000W以下
  5. 禁止在生产库做压力测试
  6. 禁止从测试、开发环境直接生产库

库表设计

  1. 生产环境禁止使用分区表
  2. 拆分大字段及访问频率低的字段,分离冷热数据
  3. Hash分表时,表后缀必须是10进制数
  4. 按日期分表时,年份使用2位而不使用4位
  5. 采用合适的Sharding策略,userId、date、province、
  6. 尽量不使用外键,由程序来保证约束 有额外开销、逐行操作、高并发时容易死锁
  7. 单库表数量不超过300张
  8. 单表字段数不超过50个
  9. 单行不超过200字节

字段规范

  1. 尽可能不使用TEXT,CLOB,BLOB类型的字段: 对于大文本存储,可以使用varchar类型,varchar(65535) -> 64K 如果一定要使用,可以单独拆成一个表来使用
  2. 尽量不在数据库中保存图片,文件等大字段
  3. 涉及金额的字段一律使用 Decimal类型,绝对不允许使用 double/float 类型
  4. 使用合适的数据类型: tinyint(1),smallint(2),mediumint(3),int(4),bigint(8),float(4),double(8),decimal(总长度,小数部分长度)
  5. 除非NULL有特殊含意,所有字段不许为空: 很难进行查询优化、NULL列加索引需额外空间、含NULL复合索引无效、应用开发容易出空指针异常
  6. 时间可以使用datetime类型
  7. 不要使用枚举类型

索引规范

  1. 单张表索引数量最好不超过5个
  2. 单个索引中字段数不超过5个
  3. 对字符串类型的字段使用前缀索引,前缀索引长度不超过8个字符
  4. 表必须有主键,主键不应该更新 禁止使用UUID,MD5,Hash结果作为主键。 推荐使用独立于业务的Auto_increment字列,或全局ID生成器作代理主键 数字型相比字符串型索引:高效、查询快、占空间小
  5. 重要的SQL必须被索引 where条件中的字段、order by、group by、distinct 字段、多表join的字段
  6. 区分度大的字符放在前面
  7. 核心SQL优先考虑覆盖索引
  8. 避免冗余和重复索引
  9. 不在低区分度字段建索引,如:性别,车型,车款
  10. 不要在索引字段进行数学运算和函数运算,索引会失效
  11. 查询时,不使用%前导的查询,如: like '%cd'
  12. 尽量不使用负向查询,如:not in / not like / <> / != 原因:全表扫描

SQL设计

  1. 使用预编译语句和参数形式,不手动拼接SQL字符串,1)提高性能 2)防止SQL注入
  2. 充份利用索引,尤其前缀索引
  3. 避免使用存储过程、触发器、UDF、Events等 原因:1)降低业务复杂度,所有业务处理都不放在数据库进行,只让数据库做最擅长的事情;2)存储过程出Bug不好调试
  4. 避免大表Join
  5. 避免在数据库中进行数学运算 原因:1)数据库不擅长做数学运算和逻辑判断;2)可能会使索引失效
  6. 减少与数据库的交互次数 INSERT ... ON DUPLICATE KEY UPDATE REPLACE INTO、INSERT IGNORE 、INSERT INTO VALUES(),(),() UPDATE … WHERE ID IN(10,20,50,…)
  7. 合理使用分页 限制分页展示的页数,如:页面上只显示有100页数据 只能点击上一页、下一页,不能随意跳转页号 采用延迟关联:不直接关联两张大表,而是先查一张表,再用主键从另一张表中查数据
  8. 拒绝大SQL,将大SQL拆分成小SQL 简单SQL的缓存命中率高;1条SQL只能使用一个核,把大SQL拆成多个小SQL可以充份利用多核CPU;减少锁表时间
  9. 拒绝大事务,事务使用原则: 即开即用,用完即关 与事务无关的操作放在事务外面 不破坏一致性的前提下,使用多个短事务替代长事务
  10. 拒绝大批量
  11. 使用in来代替 orin中的值不许超过200个 对于使用or的SQL,如果or的条件不是同一个字段,可以使用 union 来优化
  12. 禁止使用 order by rand(),除非数据量非常少
  13. 在上线前,使用 explain 来分析SQL的执行计划
  14. 使用 union all ,不使用 union
  15. 尽量不使用 select * 来执行查询,原因: 消耗网络带宽
  16. 实时统计计数使用缓存,双向更新凌晨跑基准;非实时在数据仓库统计
  17. 高效分页:使用查询条件减少数据集 select * from table where id>=12345 limit 10;
  18. 使用同数据类型在where条件中进行列值比较 数字对数字、字符对字符 数值列与字符串比较:同时转为双精度 字符串列与数字比较:字符串列转数值,并且不会使用索引
  19. group by 默认会排序,如果不需要对分组结果排序,可以使用 order by null,这样就不会对结果排序了。 select phone, count(*) from post group by phone order by null

行为规范

  1. 批量导⼊、导出数据必须提前通知DBA协助观察
  2. 禁⽌在线上从库执⾏后台管理和统计类查询
  3. 禁⽌有super权限的应⽤程序账号存在
  4. 产品出现⾮数据库导致的故障时及时通知DBA协助排查
  5. 推⼲活动或上线新功能必须提前通知DBA进⾏流量评估
  6. 数据库数据丢失,及时联系DBA进⾏恢复
  7. 对单表的多次alter操作必须合并为⼀次操作
  8. 不在MySQL数据库中存放业务逻辑
  9. 重⼤项目的数据库⽅案选型和设计必须提前通知DBA参与
  10. 对特别重要的库表,提前与DBA沟通确定维护和备份优先
  11. 不在业务⾼峰期批量更新、查询数据库
  12. 提交线上建表改表需求,必须详细注明所有相关SQL语句

© 著作权归作者所有

共有 人打赏支持
古城痴人
粉丝 16
博文 16
码字总数 19276
作品 0
朝阳
高级程序员
OSC 第 136 期高手问答 — MySQL 开发和运维规范

OSCHINA 本期高手问答(2016 年 12 月 6 日 — 12 月 13 日)我们请来了@叶金荣和@吴炳锡为大家解答 MySQL 开发和运维规范相关的问题。 叶金荣,知数堂培训联合创始人,Oracle MySQL ACE,A...

局长 ⋅ 2016/12/06 ⋅ 53

美图秀秀DBA谈MySQL运维及优化

随着MySQL应用的不断普及和自身发展,如何更好的优化MySQL和使用MySQL,依然是一个比较有挑战的问题,尤其是在业务快速增长的场景下。本次分享主要介绍一些通用的运维优化实践和问题,以及未...

杨尚刚 ⋅ 2015/12/31 ⋅ 0

Java数据库连接——JDBC编程

本文概述 本篇文章将分四块内容对JDBC编程进行介绍: 一. JDBC编程概述 二. JDBC开发步骤 三. 工具类撰写和使用 四. properties配置文件 一. JDBC编程概述 1. 什么JDBC   JDBC(Java Data...

Mr_Yanger ⋅ 2017/12/07 ⋅ 0

基于 Laravel 开发的用户生态系统--ThinkSNS Plus

ThinkSNS+ 是基于 Laravel 开发的一个用户生态基础框架系统,支持动态拓展应用的接入和UI规范设计。 特点 基于 Laravel 开发的用户生态系统。 REST ful 接口. 后台管理采用 Vue.js 开发。 很...

medz ⋅ 2017/09/05 ⋅ 3

JAVA开发环境选择与配置

现在支持J2EE的开发、部署环境很多。用的最多的开发环境(IDE)开发工具有Eclipse(开放源代码)、JBuilder,其他的有WebGain;另外一般的应用服务器提供商也提供相应的开发工具,如BEA公司的...

最新更新消息 ⋅ 2015/12/09 ⋅ 0

使用2-3法则设计分布式数据访问层

分布式DAL解决的问题 在分布式系统中,每一台服务器都需要访问本地缓存、分布式MC缓存、分布式后台数据库,对于同一个业务模块,随着业务变复杂,需要定义越来越多的数据Model,按照一定的规...

李丁玲 ⋅ 2016/03/04 ⋅ 0

高手问答第 161 期 —— 追求性能和稳定,MySQL 中间件该如何选型?

OSCHINA 本期高手问答(2017 年 7 月 12 日 — 7 月 18 日)我们请来了@叶金荣和@吴炳锡为大家解答 MySQL 中间件选型方面的问题。 叶金荣,知数堂培训联合创始人,Oracle MySQL ACE,MySQL 布...

局长 ⋅ 2017/07/11 ⋅ 34

互联网 MySQL 开发规范

写在前面:无规矩不成方圆。对于刚加入互联网的朋友们,肯定会接触到MySQL,MySQL作为互联网最流行的关系型数据库产品,它有它擅长的地方,也有它不足的短板,针对它的特性,结合互联网大多应...

xrzs ⋅ 2015/07/10 ⋅ 0

基于 ThinkPHP 的后台管理框架 - Tplay

Tplay是一款基于ThinkPHP5.0.13 + layui2.2.45 + Mysql开发的后台管理框架,PHP版本要求提升到5.5,Tplay集成了一般应用所必须的功能模块,为开发者减少重复性的工作,提升开发速度,规范团队...

听雨er ⋅ 2017/12/24 ⋅ 7

26. Python 对 mysql 的操作

mysql数据库现在已经成为市场占有率最高的数据库,在开发过程中,很多情况下我们都需要操作mysql,所以对于python操作mysql的了解是必不可少的。 Python标准数据库接口为Python DB-API, Pyth...

ln286577399 ⋅ 2017/11/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部