开发规范(一):Mysql篇

简介: 开发规范(一):Mysql篇


1. 流程

数据库表结构的修改需要相关人员和Leader一起评审,保证符合涉及规范。

不允许使用root账号,所有开发和测试应当分配指定账号,并授予最小数据库权限

2. 数据库与表规范

表命名规范

  1. 常规表表名以 t_开头,t 代表 table 的意思,命名规则即 「t + 模块(包含模块含义的简写)+ 表(包含表含义的简写)」,比如用户模块的教育信息表:t_user_eduinfo。
  2. 临时表(RD、QA 或 DBA 同学用于数据临时处理的表),命名规则: 「temp 前缀+模块+表+日期后缀」:temp_user_eduinfo_20210719
  3. 备份表(用于保存和归档历史数据或者作为灾备恢复的数据)命名规则, 「bak 前缀+模块+表+日期后缀」:bak_user_eduinfo_20210719
  4. 区分位: iz_* [String(1)] 1表示是 0表示否,(禁用 is_,代码生成实体有问题 )
  5. 状态位: *_status [String(1-2)] 状态字段必须加注释说明每个值代表含义
  6. 同一个模块的表尽可能使用相同的前缀,表名称尽可能表达含义
  7. 多个单词以下划线 _ 分隔
  8. 常规表表名尽量不超过 30 个字符,temp 表和 bak 表视情况而定,也尽量简短为宜,命名应使用小写

数据库对象设计规范

  1. 字符集统一使用 utf8mb4,排序 utf8mb4_general_ci
  2. 不允许使用视图、存储过程、触发器
  3. 数据库引擎统一 innodb
  4. 模块划分和代码中业务模块一致

表设计规范

  1. 不要使用外键
  2. 表必须有主键,设置为varchar(64),唯一
  3. 表必须有create_time(timestamp)字段
  4. 表必须有update_time(timestamp)字段
  5. 禁止使用复杂类型,json使用要看情况
  6. 「需要json连接的字段,类型必须一致,防止隐式转换」
  7. 严禁使用分区表
  8. 单表字段数不要太多,建议最多不要大于50个。过度的宽表对性能也是很大的影响。
  9. MySQL在处理大表时,性能就开始明显降低,所以建议单表物理大小限制在16GB,表中数据行数控制在2000W内。^[业内的规则是超过2000W性能开始明显降低。但是这个值是灵活的,你可以根据实际情况进行测试来判断,比如阿里的标准就是500W,百度的确是2000W。实际上是否宽表,单行数据所占用的空间都有起到作用的。

] 10. 表字段注释,每个字段必须设置注释说明; 11. 表字段注释,状态类型的字段必须说明取值规则(比如性别sex取值规则)

3. 字段规范

字段命名规范
  1. 字段命名需要表示其实际含义的英文单词或简写, 「单词之间用下划线 _ 进行连接」,如 service_ip、service_port。
  2. 「各表之间相同意义的字段必须同名」,比如 a 表和 b 表都有创建时间,应该统一为 create_time,不一致会很混乱。
  3. 多个单词以下划线 _ 分隔
  4. 字段名尽量不超过 30 个字符, 「命名应该使用小写」
字段设计规范
  1. 「对于精确浮点型数据存储,需要使用DECIMAL」,严禁使用FLOAT和DOUBLE
  2. 禁止使用TEXT、BLOG字段,特殊情况除外
  3. 「字段使用NOT NULL属性」,可用默认值代替NULL
  4. 区分、状态、类型字段,尽量用String类型,避免数字类型的一些问题
  5. 字段默认值(字段尽量不设置默认值,采用编码方式加默认值)
  6. 逻辑删除字段,del_flag [int(1)],1表示删除 0表示未删除 ,可选择加
  7. 乐观锁字段, update_count[Integer],可选择加

4. 索引规范

索引命名规范
  1. 唯一索引使用 「uni + 字段名」 来命名:create unique index uni_uid on t_user_basic(uid) 。
  2. 非唯一索引使用 「idx + 字段名」 来命名:create index idx_uname_mobile on t_user_basic(uname,mobile) 。
  3. 多个单词以 「下划线 _ 分隔」
  4. 索引名尽量不超过50个字符,命名应该使用小写,组合索引的字段不宜太多,不然也不利于查询效率的提升。
  5. 多单词组成的列名,取尽可能代表意义的缩写,如 test_contact表member_id和friend_id上的组合索引:idx_mid_fid。
  6. 「理解组合索引最左前缀原则,避免重复建设索引」,如果建立了(a,b,c),相当于建立了(a), (a,b), (a,b,c)。
索引设计规范
  1. 索引必须创建在索引选择性(区分度)较高的列上,选择性的计算方式为: selecttivity = count(distinct c_name)/count(*) ; 如果区分度结果小于0.2,则不建议在此列上创建索引,否则大概率会拖慢SQL执行
  2. 单张表的索引数量理论上应 「控制在5个以内」。经常有大批量插入、更新操作表,应尽量少建索引,索引建立的原则理论上是 「多读少写的场景」
  3. 「ORDER BY,GROUP BY,DISTINCT的字段需要添加在索引的后面,形成覆盖索引」
  4. 联合索引注意 「最左匹配原则」:必须按照从左到右的顺序匹配,MySQL会一直向右匹配索引直到遇到范围查询(>、<、between、like)然后停止匹配。如:depno=1 and empname>'' and job=1 如果建立(depno,empname,job)顺序的索引,job是用不到索引的。
  5. 应需而取策略,查询记录的时候, 「不要一上来就使用」*,只取需要的数据,可能的话尽量只利用索引覆盖,可以减少回表操作,提升效率。
  6. 避免索引失效的原则: 「禁止对索引字段使用函数、运算符操作,会使索引失效」
  7. 「避免非必要的类型转换」,字符串字段使用数值进行比较的时候会导致索引无效。
  8. 「模糊查询'%value%'会使索引无效」,变为全表扫描,因为无法判断扫描的区间, 「但是'value%'是可以有效利用索引」
  9. 「索引覆盖排序字段」,这样可以减少排序步骤,提升查询效率
  10. 「尽量的扩展索引,非必要不新建索引」。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。

扩展下最左前缀

这里创建一个索引

CREATEINDEX idx_name ONusers (first_name, last_name);

在这个索引中,first_name 是最左前缀。现在,当您执行类似以下的查询时,索引可以被有效地利用:

SELECT * FROMusersWHERE first_name = 'John'AND last_name = 'Doe';

5. SQL 查询编写规范

  1. 不允许使用 select *
  2. 查询必须加where条件,避免全表扫描
  3. 如果必须有TEXT对象,必须单独加表并关联
  4. where条件中过滤字段严禁使用任何函数,包括数据类型转换函数
  5. 分页查询必须带排序条件
  6. 用in/union替换or,并注意in个数小于300
  7. 如无必要不要使用%前缀进行模糊查询,避免全表查询
  8. 避免使用子查询,转为join连接

子查询性能差原因

「「·」」 子查询的结果集无法使用索引,通常子查询的结果集会被存储到临时表中,不论是内存临时表还是磁盘临时表都不会存在索引,所以查询性能 会受到一定的影响;

「「·」」 特别是对于返回结果集比较大的子查询,其对查询性能的影响也就越大;

「「·」」 由于子查询会产生大量的临时表也没有索引,所以会消耗过多的CPU和IO资源,产生大量的慢查询。

6. 事务管理和性能优化

  1. 所有方法涉及到更新、删除、添加操作需要使用 @Transactional注解
  2. 数据量大的情况下, 需要分批次操作

7. 安全性考虑

  • 数据库配置应当使用druid等框架对明文进行加密
  • 避免拼接SQL
  • 防止SQL注入

本文由 mdnice 多平台发布

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
索引 存储 数据库
数据库设计规范
基于阿里数据库设计规范扩展而来
52176 4
|
消息中间件 NoSQL JavaScript
阿里官方 Redis 开发规范
阿里官方 Redis 开发规范
软件工程——软件开发阶段(概要设计、详细设计)
需求分析确定了系统的开发目标,下一步工作就是软件设计。软件设计可以进一步地 分为两个阶段:总体设计和详细设计。确定系统的具体 实现方案、给出软件的模块结构、编写各个文档
|
9月前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本、点、框等提示进行图像与视频分割的统一基础模型,突破传统限制,实现开放词汇概念的精准识别与跟踪,涵盖超400万独特概念,推动视觉分割新发展。
3129 6
|
9月前
|
人工智能 API 调度
我用 n8n 教自动化,结果自己在干最蠢的活
作者本为学员免费开通n8n账号,却因频繁手动操作陷入效率困境。起初尝试全自动流程,反被滥用;最终引入“人在回路”(HITL)机制,结合自动化与人工审核,用飞书审批实现高效协作。真正高效的自动化,是让机器处理重复工作,人类专注核心决策。
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
11670 137
|
存储 运维 NoSQL
如何撰写好的技术方案设计-真实案例干货分享
如何撰写好的技术方案设计-真实案例干货分享
3946 0
|
存储 关系型数据库 MySQL
【阿里规约】阿里开发手册解读——数据库和ORM篇
从命名规范、建表规范、查询规范、索引规范、操作规范等角度出发,详细阐述MySQL数据库使用过程中所需要遵循的各种规范。
【阿里规约】阿里开发手册解读——数据库和ORM篇
|
存储 关系型数据库 MySQL
阿里巴巴MYSQL 开发规范
阿里巴巴MYSQL 开发规范
2336 0
|
Ubuntu Linux 测试技术
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试(上)
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试
2272 0