Mysql数据库使用规范

1. 命名规范

1.1、命名总规则

  1. 所有名称的字符范围为:A-Z, a-z, 0-9 和_(下划线),禁止许使用其他字符作为名称;
  2. 采用英文单词或英文短语(包括缩写)作为名称,禁止使用无意义的字符或汉语拼音;
  3. 名称应该清晰明了,能够准确表达事物的含义,最好可读,遵循“见名知意”的原则;
  4. 禁止使用mysql系统保留字作为表名、库名、字段名、函数名、过程名(mysql保留字列表参考);

1.2、数据库命名规范

  1. 数据库名格式统一由前缀"tset"或对应主业务系统名称的英文单词(如baidu,ailearn)、分支业务系统名称的英文单词组成,以下划线分隔,单词强制采用小写;
  2. 数据库名称必须控制在32个字符以内;
  3. 创建数据库时必须显式指定字符集,并且字符集只能是utf8或者utf8mb4(提前规划和评估好),减少上线后对数据库的ddl操作;
  4. 数据库实例端口原则上禁止使用默认端口3306,降低被攻击的风险。

1.3、表命名规范

  1. 表名以代表表内的内容的一个和多个名词组成,以下划线分隔,单词默认采用小写;
  2. 表名需要增加前缀(与模块名强相关),同一模块的表名尽量使用统一的前缀,例如:entity表示主表,link表示关系表,auth表示权限表,xs表示xunsearch的索引表;
  3. 表的前缀以后,是表的具体内容的描述;
  4. 一些作为多对多连接的表,可以使用两个表的前缀作为表名;
  5. 表和列的名称必须控制在32个字符以内且必须有备注;
  6. 当系统中有一些少量的,重复出现的值时,使用字典表来节约存储空间和优化查询。如地区、系统中用户类型的代号等,这类值不会在程序的运行期变化,但是需要存储在数据库中,字典表统一以dic_作为前缀。

1.4、字段命名规范

  1. 字段不使用任何前缀(表名代表了一个名称空间,字段前面再加前缀显得罗嗦);
  2. 字典名也避免采用过于普遍过于简单的名称:例如,用户表中,用户名的字段为UserName比Name更好;
  3. 布尔型的字段,以一些助动词开头,更加直接生动:如,用户是否有留言HasMessage,用户是否通过检查IsChecked等;
  4. 字段名为英文短语、形容词+名词或助动词+动词时态的形式表示,大小写混合,遵循“见名知意”的原则;
  5. 所有字段包括主键必须有备注。

2、SQL语句规范

  1. 禁止使用SELECT * FROM ......(包括子查询),必须指明且仅读取业务需要的具体字段,减少io及内存开销;
  2. 禁止使用CREATE TABLE ...... SELECT .....;
  3. 避免使用子查询;
  4. 避免在数据库中做运算;
  5. 所有的SQL关键字大写;
  6. 在使用索引时需要注意字段格式(字段类型和值保持统一),当字段为字符类型而where条件中匹配的是数字时,虽然不会报错,但是无法使用索引;
  7. 避免使用触发器和函数、视图、存储过程;
  8. 避免在where后的筛选字段上做聚合函数的运算;
  9. 语句中有group by和order by子句时,该字段建议添加索引减少开销提高性能,所以能用distinct就不用group by,有时可以先过滤数据然后再group by;
  10. 用in代替or条件,sql语句中where条件子句用到in关键字的,一般控制在50个值以内(测试发现小于20效果比较好),而且in字段要有索引,有时候可以用exists比用in更好;
  11. 禁止使用未带where条件的select、update和delete操作,且delete操作中尽量加上limit限制;
  12. 对于固定且定期执行的select查询操作,请用sql_cache缓存,提高二次查询效率;
  13. 避免使用!=或者<>操作符及is null 或者is not null条件使得索引失效;
  14. 对于连续的数值,请使用between...and;
  15. 尽量减少使用JOIN查询或者在join时确保on的字段都加了索引,关联查询表尽量控制在2个表之内且减少大表之间关联查询;
  16. 尽量用union all(不执行distinct函数)代替union,减少不必要的资源;
  17. 对于表结构变更,如添加表字段和添加表索引,请在sql最后加上",ALGORITHM=INPLACE"参数(注意:含有逗号)。

3、数据库表设计规范

  1. 建表时必须显示的指定字符集为utf8或者utf8mb4(建议都使用utf8mb4);
  2. 建表时必须显示的指定存储引擎,如无特殊需求一律使用Innodb;
  3. 所有表必须有主键,主键应是名为id ,且类型为bigint 的自增字段(建表前必须优先评估表容量)且设成unsigned;
  4. 业务中选择性很少的状态status、类型type、“是否”或者可以用tinytint即可满足的字段,禁止使用int、bigint、字符类型以节省存储空间((注:统一设计成tinyint(4))
  5. 业务中IP地址字段推荐使用int类型,避免使用char(15),(因为int只占4字节,可以用函数相互转换,而char(15)占用至少15字节,一旦表数据行数到了1亿,那么要多用1.1G存储空间);
  6. 字段尽量减少使用enum、set类型,(因为它们浪费空间,且枚举值写死了,变更不方便,推荐使用tinyint或smallint);
  7. 标识表里每一行主体的字段不要设为主键,建议设为其他字段如user_id,order_id等,并建立unique key索引,(因为如果设为主键且主键值为随机插入,则会导致innodb内部page分裂和大量随机I/O,性能下降);
  8. 如无特殊情况,所有表(如用户表,金钱相关的表字段建议用int而非double)必须有创建时间字段和最后更新时间字段,便于排查问题,统一设置成create_time和update_time(设成自动更新)
  9. 所有时间字段类型统一采用datetime,如无特殊需求默认值统一设置成current_timestamp,如有更新时间的请设成自动更新时间ON UPDATE CURRENT_TIMESTAMP;;
  10. 除BLOB和TEXT字段之外所有字段必须都是NOT NULL属性且根据需要定义DEFAULT值,(建议:整型字段default 0,字符字段default '', datetime字段default CURRENT_TIMESTAMP),因为使用NULL值会存在每一行都会占用额外存储空间、数据迁移容易出错、聚合函数计算结果偏差等问题;
  11. 选用能满足需求的最小类型,对于固定长度的字符串应使用char类型,对于varchar类型应根据实际使用,不要分配过大的长度。varchar(50)表示最大存储50个字符而不是50字节;
  12. 所有表及所有字段必须添加备注,默认字符集及排序规则统一设置成utf8mb4,所有新增表表备注必须遵循格式【COMMENT="所属业务功能-建表组-建表人-建表时间"】如:create table table_name(...) engine=innodb ... comment="人员信息表-php组-盘风-20200324";
  13. 文本字段应尽量设置成varchar, 避免将字段设为textblob类型,如果不能避免,应尽可能在设计表时将textblob类型的字段垂直拆分到其他表里,仅在需要读这些对象的时候才去select;
  14. 反范式设计:把经常需要join查询的字段,在其他表里冗余一份。如:user_name属性在user_account,user_login_log等表里冗余一份,减少join查询;
  15. 中间表用于保留中间结果集,名称必须以“tmp_”开头,备份表用于备份或抓取源表快照,名称必须以“bak_”开头,中间表和备份表定期清理;

  16. 避免使用外键,以提高性能;
  17. 所有数据库表数据必须有数据保留周期和数据清理周期,表设计之初请RD和PM沟通数据保留周期和清理周期,老的历史数据或者使用不频繁的历史数据建议迁移到历史库或者hbase中。

4、分库分表、分区表规范

  1. 单表达到3000w以上的建议进行分表或分区表;
  2. 分区表的分区字段(partition-key)必须有索引,或者是组合索引的首列;
  3. 单个分区表中的分区(包括子分区)个数不能超过1024;
  4. 上线前RD或者DBA必须指定分区表的创建、清理策略;
  5. 访问分区表的SQL必须包含分区键;
  6. 单个分区文件不超过2G,总大小不超过50G,建议总分区数不超过20个;
  7. 对于分区表执行alter table操作,必须在业务低峰期执行;
  8. 采用分库策略的,库的数量不能超过1024;
  9. 采用分表策略的,表的数量不能超过4096;
  10. 单个分表不超过500W行,ibd文件大小不超过2G,这样才能让数据分布式变得性能更佳;
  11. 水平分表尽量用取模方式,日志、报表类数据建议采用日期进行分表。

5、索引设计原则

  1. InnoDB表必须主键为id int/bigint auto_increment,且主键值禁止被更新,且主键的名称以“pk_”开头,唯一键以“uniq_”开头(尽量不使用唯一索引,由程序保证约束),普通索引以“idx_”开头,一律使用小写格式,以表名/字段的名称或缩写作为后缀;
  2. InnoDB和MyISAM存储引擎表,索引类型必须为BTREE;MEMORY表可以根据需要选择HASH或者BTREE类型索引;
  3. 最左前缀匹配原则,这是索引中最重要的一个原则。简单的讲就是,当你创建一个(a,b,c,d)的索引时,这个索引中已经包含了索引(a,b,c)、(a,b)、(a),而不需要再单独创建这些索引了;
  4. 尽量少的创建索引,当你创建了一个索引时,虽然提高了查找速度,但是却在修改数据时额外增加了修改索引的开销;如果表数据量小的(几十或者几百条数据)可以不用建索引;
  5. 对于大表来说,创建表的时候可不规划索引,待数据插入完成之后或者数据量达到一定量(成千上万)之后再创建索引;
  6. 索引列不应成为表达式的一部分或者函数的参数;
  7. 多考虑建立联合索引,并把区分度最高的字段放在最前面。如列userid的区分度可由select count(distinct userid)计算出来;
  8. 如果复合索引中的某一列需要频繁使用范围查找,应将该字段放到复合索引的最后,因为当复合索引中某一字段进行了范围查找后,那么他之后的索引将不能被使用;
  9. 当使用LIKE关键字做范围查找时,只有形如LIKE 'abc%'这样的匹配可以使用到索引,而LIKE '%abc'LIKE '%abc%'则无法使用索引;
  10. 超过20个长度的字符串列,应做前缀索引,例如:alter table city_demo add key (city(6));利用city的前6个字符做索引;
  11. 在排序中也可以利用索引,但是要求排序顺序和索引顺序相同;
  12. 单个索引中每个索引记录的长度不能超过64KB;
  13. 单个表上的索引个数不能超过7个;
  14. 在多表join的SQL里,保证被驱动表的连接列上有索引,这样join执行效率最高。

6、线上数据库修改规范

  1. 线上数据修改应由各部门负责人审批通过后交由DBA进行修改;
  2. 对于多项修改之间有先后顺序的,申请修改时应注明修改顺序;
  3. 对于线上数据修改,DBA应根据修改的内容评估变更的规模,以及制定恢复方案,如:在修改前备份修改的内容;
  4. 对于线上表结构变更,DBA应确认该表没有大规模/长时间事务运行的情况下使用online DDL或者pt-online-schema-change修改。

7、DB服务器登陆权限规范

  1. DB服务器应由DBA(或经由DBA授权后)登录进行操作;
  2. DB服务器禁止长时间执行与数据库无关的命令或程序;
  3. DB服务器禁止执行可能会消耗大量系统资源(包括IO,内存,CPU等),且与数据库无关的命令或程序;
  4. 应尽量避免直接使用命令行操作数据库,建议使用图形客户端或者脚本操作数据库,以避免误操作;
  5. 使用交互式连接时(包括各类数据库客户端),如短时间内不进行操作,应及时断开连接,以避免误操作。

8、DB服务权限规范

  1. 应用程序帐号权限需要做严格限制,对不同应用需求使用不同权限和操作范围帐号, 要有部门负责人确认;
  2. 所有帐号名称、访问权限、应用程序名称必须记录在案;
  3. 在防火墙上严格限制数据库端口访问的IP地址,只有正常对外服务的应用服务器IP 可以访问相关数据库;
  4. 数据库超级用户权限使用严格限制。

9、DB服务器及服务安全规范

  1. 帐号密码需要有复杂性要求(字母、数字、特殊符号:0-9a-zA-Z~!@#$%^&*()-+的随机组合),尽量不用固定密码,实行单用户单密码,长度在16位以上;
  2. 线上使用的账户只允许内网访问;
  3. 超级用户账户每3个月更新一次密码,同时不可使用重复密码;
  4. 设置密码过期和保存机制;
  5. 禁止root用户远程登录;
  6. 移除匿名用户及test数据库;
  7. 如无特殊需求,禁止开启general log日志;
  8. 坚持最小权限原则,除DBA之外所有人员只有只读权限,按需将权限在库、表级别进行隔离;
  9. 启用ssl认证连接;
  10. 用户帐户划分原则(包括:超级管理员帐号,系统应用帐号如备份、复制、审计、监控等,应用业务帐号、业务人员帐号、开发人员帐号、测试人员帐号、其他专用帐号);
  11. 定制密码表和用户权限表,并定期维护和更新;
  12. 安装补丁,升级版本,统一版本;
  13. 加强监控和审计,防患于未然

Mysql数据库使用规范相关推荐

  1. 互联网寒冬!技术站最全MySQL数据库实战规范

    享学课堂特邀作者:老顾 转载请声明出处! 前言 我们小伙伴们经常使用到mysql数据库,一般就这么一用,很少会考虑mysql里面的细节问题,如sql语句的规范,或索引有没有起到相应的效果,今天老顾就给 ...

  2. MySQL数据库开发规范

    MySQL数据库开发规范 一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码, ...

  3. 58到家MySQL数据库开发规范(javamysql数据)

    58到家MySQL数据库开发规范(javamysql数据) 一.基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1)通用,无乱码风险,汉字3字 ...

  4. MySQL数据库开发规范-EC

    最近一段时间一边在线上抓取SQL来优化,一边在整理这个开发规范,尽量减少新的问题SQL进入生产库.今天也是对公司的开发做了一次培训,PPT就不放上来了,里面有十来个生产SQL的案例.因为规范大部分还是 ...

  5. mysql数据库开发规范_开发规范——MYSQL数据库

    数据库规范 这里主要针对mysql数据库,其他数据库也可以借鉴 表 1.统一使用表命名规范 表名规范:分层+项目名缩写+实体名(小写)[+下划线+实体名+rel] 例子 表名:bc_user 分层: ...

  6. mysql datetime 比较大小_【知识点】分布式事务数据库 —-MySQL 数据库开发规范(第一节)...

    目录 (1)数据类型: (2)表名称与字段名称设计规则: (3)字符集: (4)字符串函数-3.1-3.5 : (5)字母大小写转换函数 : (6)数学函数 : (7)日期操作函数 : (8)类型转换 ...

  7. mysql时间相减得到天数保留两位_【敲黑板!】分布式事务数据库 —-MySQL 数据库开发规范(第四节)...

    今天Amy着重为大家讲解一下关于函数的一些硬核知识,也是本文中非常重要的一个章节,记得认真看(dianzan)哦~ 第四节.函数 4.1 字符串连接函数 MySQL 数据库中字符串连接方法,需使用 C ...

  8. mysql数据库命名规范

    文档摘抄来自:https://blog.csdn.net/chl191623691/article/details/78247497/ 本人经验:不要出现短横线等等其他字符!! 1. 数据库涉及字符规 ...

  9. MySQL数据库命名规范及约定

    一.[操作规范] 1. 如无备注,则表中的第一个id字段一定是主键且为自动增长: 2. 如无备注,则数值类型的字段请使用UNSIGNED属性: 3. 如无备注,排序字段order_id在程序中默认使用 ...

最新文章

  1. 扩增子图表解读5火山图:差异OTU的数量及变化规律
  2. 赶考在线执业药师,7-8月提分策略,化繁为简
  3. 12层打败50层,ParNet 普林斯顿+英特尔:更深不一定更好
  4. TabHost的使用(二):实现TabHost.TabContentFactory接口
  5. LightOJ 1084 Winter(记忆化搜索)
  6. 网工协议基础(4)TCP/UDP协议
  7. Python(十)之GUI编程
  8. 央视315曝光SDK事件,应用开发者如何避坑?
  9. 5G关键技术研究方向
  10. 驱动12.移植dm9000驱动程序
  11. 测试路由速度软件,服务器网络测试工具PING测试和路由Tracert测试工具使用和区别...
  12. linux下nginx重启命令
  13. hd620显卡linux驱动,Thinkpad T480 Win7 安装 INTEL HD620显卡驱动
  14. Palm 与 webOS 之死
  15. R语言绘制复杂抽样设计数据cox回归生存曲线(Kaplan-Meier)
  16. 【Python】只需2行代码,轻松将PDF转换成Word(含示范案例)
  17. Rainbow: 结合深度强化学习的改进
  18. OA项目中遇到的问题
  19. 分析LogFilter
  20. 【Java】自定义异常

热门文章

  1. Android-屏幕截图功能实现
  2. java调用百度内容审核接口检查文本
  3. 深度学习初学者推荐怎么在本地完成CS231n课程作业-配置环境
  4. Winform MDI窗体子窗体显示区域大小
  5. deep learning:Theano安装攻略
  6. YOLOv5-detect
  7. 从单块架构到分布式架构之数据库集群(三)
  8. python爬取豆瓣电影top250并保存为xlsx_python 爬虫获取豆瓣电影排行榜前250并写入excel...
  9. jinja2中if和for的使用
  10. Proteus 8 中文版安装教程