一、数据库命名规范

1. 数据对象名称小写字母,并用下划线分割
2. 数据库名做到见名识义,不超过32个字符
3. 临时库表必须以tmp为前缀,并以日期为后缀
4. 备份库表必须以bak为前缀,并以日期为后缀
5. 所有存储相同数据的列名和列类型必须一致

二、数据库基本设计规范

1. 所有表必须使用Innodb存储引擎
2. 数据库和表的字符集统一使用UTF-8
3. 所有表和字段都需要添加注释(用comment)
4. 尽量控制单表数据量的大小,建议控制在500万以内

可以用历史数据归档,分库分表等手段来控制数据量大小

5. 谨慎使用MySQL分区表

分区表在物理上表现为多个文件,在逻辑上表现为一个表

如果非要用的话,也谨慎选择分区键,跨分区查询效率可能更低

建议采用物理分表的方式管理大数据

6. 尽量做到冷热数据分离,减小表的宽度

即控制表的列数
减少磁盘IO,保证热数据的内存缓存命中率
利用更有效的利用缓存,避免读入无用的冷数据
经常一起使用的列放到一个表中

7. 禁止在表中建立预留字段

预留字段的命名很难做到见名识义
预留字段无法确认存储的数据类型,所以无法选择合适的类型
对预留字段类型的修改,会对表进行锁定

8. 禁止在数据库中存储图片,文件等二进制数据

正确做法是把图片或文件,存储到相应的文件服务器中,而在数据库中只存储图片的位置信息

9. 禁止在线上做数据库压力测试
10. 禁止从开发环境,测试环境直连生产环境数据库

三、索引设计规范

1. 限制每张表上的索引数量,建议单张表索引不超过5个
2. 每个Innodb表必须有一个主键

不使用更新频繁的列作为主键,不使用多列主键
不使用UUID、MD5、HASH、字符串列作为主键
主键建议选择使用自增ID值

3. 区分度最高的列放在联合索引的最左侧

尽量把字段长度小的列放在联合索引的最左侧
使用最频繁的列放到联合索引的左侧

4. 避免建立冗余索引和重复索引
5. 对于频繁的查询优先考虑使用覆盖索引

避免Innodb表进行索引的二次查找
可以把随机IO变为顺序IO加快查询效率

6. 尽量避免使用外键

不建议使用外键约束,但一定在表与表之间的关联键上建立索引
外键可用于保证数据的参照完整性,但建议在业务端实现
外键会影响父表和子表的写操作从而降低性能

四、数据库字段设计规范

1. 优先选择符合存储需要的最小的数据类型

将字符串转化为数字类型存储
( INET_ATON(‘255.255.255.255’) = 4294967295 )
( INET_NTOA(4294967295) = ‘255.255.255.255’ )

2. 对于非负型的数据来说,要优先使用无符号整型来存储

无符号相对于有符号可以多出一倍的存储空间
VARCHAR(N)中的N代表的是字符数,而不是字节数
使用UTF8存储汉字Varchar(255) = 765个字节
过大的长度会消耗更多的内存

3. 避免使用TEXT、BLOB数据类型

建议把BLOB或是TEXT列分离到单独的扩展表中
TEXT或BLOB类型只能使用前缀索引

4. 避免使用ENUM数据类型

修改ENUM值需要使用ALTER语句
ENUM类型的ORDER BY操作效率低,需要额外操作
禁止使用数值作为ENUM的枚举值

5. 尽可能把所有列定义为NOT NULL
6. 使用TIMESTAMP或DATETIME类型存储时间
7. 同财务相关的金额类数据,必须使用decimal类型

五、数据库SQL开发规范

1. 建议使用预编译语句进行数据库操作
2. 避免数据类型转换
3. 合理利用存在索引,而不是盲目增加索引
4. 充分利用表上已经存在的索引

避免使用双%号的查询条件,如 a like ‘%123%’
一个SQL只能利用到复合索引中的一列进行范围查询
使用left join 或not exists 来优化not in 操作

5. 程序连接不同的数据库使用不同的账号,禁止跨库查询
6. 禁止使用SELECT * 必须使用SELECT <字段列表> 查询
7. 避免使用子查询,可以把子查询有优化为join操作
8. 避免使用JOIN关联太多的表
9. 减少同数据库的交互次数

数据库更适合处理批量操作
合并多个相同的操作到一起,可以提高处理效率

10. 使用in代替or

in的值不要超过500个
in操作可以有效的利用索引

11. 禁止使用 order by rand()进行随机排序

推荐在程序中获取一个随机值,然后从数据库获取数据的方式

12. where从句中禁止对列进行函数转换和计算

对列进行函数转换或计算会导致无法使用索引,如
where date(createtime) = ‘20130607’
可以是: where createtime >= ‘20130607’ and createtime < ‘20130608’

13. 在明显不会有重复值时使用UNION ALL而不是UNION

UNION会把所有数据放到临时表中后再进行去重操作
UNION ALL不会再对结果集进行去重操作

14. 拆分复杂的大SQL为多个小SQL

六、数据库操作行为规范

1. 超100万行的批量写操作,要分批多次进行操作
2. 对大表数据结构的修改一定要谨慎,会造成严重的锁表操作。尤其是生产环境,是不能忍受的。

对于大表使用pt-online-schema-change修改表结构

3. 禁止为程序使用的账号赋予super权限

当达到最大连接数限制时,可允许1个有super权限的用户连接

4. 对于程序连接数据库账号,遵循权限最小原则

程序使用数据库账号只能再一个DB下使用,不准跨库
程序使用的账号原则上不准有drop权限

数据库设计的规范与注意事项相关推荐

  1. oracle窗帘位图索引,Greenplum数据库设计开发规范参考.docx

    Greenplum数据库设计开发规范参考 Greenplum数据库设计开发规范参考文档2016年7月目 录Greenplum数据库设计开发规范1V1.511 前言41.1 文档目的41.2 文档范围4 ...

  2. 数据库设计开发规范-阿里.pdf

    数据库设计开发规范-阿里.pdf 链接:https://pan.baidu.com/s/1PHhQV-eSg8q5dS3oqWBvbw  提取码:kthu

  3. 数据库设计时的一些注意事项

    数据库设计注意事项 表结构设计 聚集索引 Innodb如何选择一个聚集索引 总结 但是特殊情况下例外 为什么一定使用 NOT NULL 表结构设计 在创建数据表名.字段名时要通俗易懂,易于理解,看到你 ...

  4. 数据库设计五要点 让数据库设计更加规范

    通常情况下,可以从两个方面来判断数据库是否设计的比较规范.一是看看是否拥有大量的窄表,二是宽表的数量是否足够的少.若符合这两个条件,则可以说明这个数据库的规范化水平还是比较高的.当然这是两个泛泛而谈的 ...

  5. mysql 数据库设计规范_MySQL 数据库设计初步规范V1.0

    数据库设计规范: 1,表设计规范 1.1关于表设计 a)         表名.列名必须有注释. b)         命名应使用富有意义的英文词汇或者缩写,多个单词组成的,全部大写,以"_ ...

  6. MySQL 数据库设计初步规范

    1,表设计规范 1.1关于表设计 a)         表名.列名必须有注释. b)         命名应使用富有意义的英文词汇或者缩写,多个单词组成的,全部大写,以"_"分隔开 ...

  7. mysql复数记录_mysql 数据库设计查询规范

    (一)建表规约 1.[强制]表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsignedtinyint(1表示是,0表示否) .说明:任何字段如果为非负数,必须是unsigned. ...

  8. 02-大鸭梨博客系统数据库设计及Dapper的使用

    毫无疑问,数据库的设计在一个系统中起了至关重要的作用.我们都知道,系统设计分为两部分,或者说是两个阶段,即数据库设计和功能设计.构建一个完善的系统需要这两个阶段的充分考量.周密设计.合理联接以及密切配 ...

  9. 12306的西天取经路 - 春节抢票与PostgreSQL数据库设计思考

    标签 PostgreSQL , 12306 , 春节 , 一票难求 , 门禁广告 , 数组 , 范围类型 , 抢购 , 排他约束 , 大盘分析 , 广告查询 , 火车票 背景 马上春节了,又到了火车票 ...

最新文章

  1. js事件(Event)知识整理
  2. epoll的ET和LT模式
  3. 安装php时,make步骤报错make: *** [ext/gd/gd.lo] Error 1
  4. Flutter:Navigator2.0介绍及使用
  5. kotlin学习笔记——泛型及reified函数
  6. nodejs应用部署到SAP云平台的经过
  7. 『数据库』 E-R图(实体联系图)你都不会,你设计什么数据库?
  8. leetcode刷题 74.搜索二维矩阵
  9. 大学学了一个学期的 C 语言,我们应该明白哪些知识点?别像没学一样!
  10. 漫步数理统计二十——多元随机变量
  11. python flask框架下登录注册界面_Python的Flask框架中实现简单的登录功能的教程
  12. linux车机carplay模块,卸甲科技UI2.0版本Linux车机发布
  13. android studio jdy08,JDY-08蓝牙4.0模块+V3.3手册+.pdf
  14. Qt 5.12--color
  15. 网站被黑总被跳转到其他网站的处理解决过程
  16. 环保数采仪助力绿水青山建设
  17. 如何读懂EDIFACT报文?
  18. 记一次生产数据库事故
  19. 怎样看待Android的发展前景?以及Android开发的职业规划
  20. mpp文件能转换成PDF

热门文章

  1. Java + Selenium 完成简单滑块验证学习之路(破解无缺口滑块验证码)(三)
  2. 怎么linux中创建虚拟路径,linux服务器创建虚拟路径解决文件上传路径隔离问题...
  3. WindowsUpdate检查更新报错,错误码8024402F
  4. linux 命令:unzip 详解
  5. QQ空间说说分析 Python
  6. 计算机教室应聘书,教师应聘自荐信
  7. 03-树1 树的同构
  8. 三星android拓展坞,三星Galaxy S8外接拓展坞现身:提供桌面级操作体验
  9. 细说SQL Server中的加密
  10. Python使用Turtle画奥地利国旗