开发规范(一):Mysql篇

news2024/11/26 2:22:55

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)的索引,那么只需要修改原来的索引即可。

扩展下最左前缀

这里创建一个索引

CREATE INDEX idx_name ON users (first_name, last_name);

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

SELECT * FROM users WHERE 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注入 alt

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/878065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka第三课

Flume 由三部分 Source Channel Sink 可以通过配置拦截器和Channel选择器,来实现对数据的分流, 可以通过对channel的2个存储容量的的设置,来实现对流速的控制 Kafka 同样由三大部分组成 生产者 服务器 消费者 生产者负责发送数据给服务器 服务器存储数据 消费者通过从服务器取…

Redis数据结构——压缩列表ziplist

定义 压缩列表ziplist是Redis中列表和哈希键的底层实现方式之一。 当一个列表只包含少量列表项&#xff0c;并且每个列表项要么是小整数值&#xff0c;要么是较短的字符串时&#xff0c;那么Redis就会使用压缩列表来作为列表的底层实现。 另外&#xff0c;当一个哈希表中只包含…

FPGA + WS2812采灯控制

文章目录 一、WS2812C-2020-V11、产品概述2、引出端排列及功能3、数据传输时间4、数据传输方法 二、使用WS2812C显示图片1、静态显示2、动态显示 一、WS2812C-2020-V1 1、产品概述 WS2812C-2020-V1是一个集控制电路与发光电路于一体的智能外控LED光源&#xff1b;其外型采用最…

Docker中Tomcat部署步骤

第一次访问没有东西。

2023牛客暑期多校训练营9 I.Non-Puzzle: Segment Pair(tag:差分)

文章目录 题目大意题解参考代码 题目大意 1 ≤ n , l i , r i ≤ 5 ∗ 1 0 5 1 \leq n,l_i,r_i \leq 5*10 ^5 1≤n,li​,ri​≤5∗105 题解 这题 l / r l/ r l/r 的数据在 5 1 0 5 5\times 10^5 5105 &#xff0c;想到差分。 特殊的是它有两条线段&#xff0c;对于同一个点…

Photoshop窗口->排列菜单下进行匹配缩放/位置/旋转

首先&#xff0c;在Photoshop中打开4张以上图片&#xff0c;并选择“窗口”->“排列”->"四联"&#xff1a; 将鼠标移动至其中一张图片中&#xff0c;按住“Z”键&#xff0c;拖动鼠标&#xff0c;调整图片缩放比例至60.55%&#xff0c; 再选择“窗口”->“…

一篇打通,pytest自动化测试框架详细,从0到1精通实战(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 读取文件 1、读取…

Python中使用隧道爬虫ip提升数据爬取效率

作为专业爬虫程序员&#xff0c;我们经常面临需要爬取大量数据的任务。然而&#xff0c;有些网站可能会对频繁的请求进行限制&#xff0c;这就需要我们使用隧道爬虫ip来绕过这些限制&#xff0c;提高数据爬取效率。本文将分享如何在Python中使用隧道爬虫ip实现API请求与响应的技…

Grounding DINO:根据文字提示检测任意目标

文章目录 1. 背景介绍2. 方法创新2.1 Feature Extraction and Enhancer2.2 Language-Guided Query Selection2.3 Cross-Modality Decoder2.4 Sub-Sentence Level Text Feature2.5 Loss Function3. 实验结果3.1 Zero-Shot Transfer of Grounding DINO3.2 Referring Object Detec…

多线程并发服务器

代码&#xff1a; #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 6666 //1024~49151 #define IP "192.168.122.130" //ifconfig查看本机IP #include <pthread.h> //…

urllib与数据解析

urllib爬取数据 import urllib.request as request# 定义url url "https://www.baidu.com" #模拟浏览器发起请求获取响应对象 response request.urlopen(url)""" read方法返回的是字节形式的二进制数据 二进制--》字符串 解码 decode( 编码的格式…

CSDN编程题-每日一练(2023-08-14)

CSDN编程题-每日一练&#xff08;2023-08-14&#xff09; 一、题目名称&#xff1a;小股炒股二、题目名称&#xff1a;王子闯闸门三、题目名称&#xff1a;圆小艺 一、题目名称&#xff1a;小股炒股 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述&#xff1a; …

一文带你拿下基于Selenium+Python的web自动化测试框架(附框架源码+项目实战)

一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid。 1.Selenium IDE&#xff1a;Fir…

Amazon EMR Hudi 性能调优——Clustering

随着数据体量的日益增长&#xff0c;人们对 Hudi 的查询性能也提出更多要求&#xff0c;除了 Parquet 存储格式本来的性能优势之外&#xff0c;还希望 Hudi 能够提供更多的性能优化的技术途径&#xff0c;尤其当对 Hudi 表进行高并发的写入&#xff0c;产生了大量的小文件之后&…

CentOS查看磁盘IO

CentOS查看磁盘IO 使用iotop命令&#xff08;top命令对应&#xff09; sudo iotop该命令将实时显示磁盘IO活动&#xff0c;按IO使用率排序&#xff0c;并显示每个进程的IO信息。 使用iostat命令&#xff1a; iostat -dx该命令将显示磁盘IO统计信息&#xff0c;包括每个设备…

【Windows 11】安装 Android子系统 和 Linux子系统

本文使用电脑系统&#xff1a; 文章目录 一、安卓子系统1.1 安装 WSA1.2 使用 二、Linux子系统2.1 安装 WSL 以及WSL 相关概念2.2 安装一个Linux发行版2.21 从Microsoft Store 安装2.22 用命令安装 2.23 拓展 三、拓展3.1 存储位置3.2 虚拟化技术3.3 Windows 虚拟内存3.3 wsl …

聊聊RedisTemplate的各种序列化器

[版权申明] 非商业目的注明出处可自由转载 出自&#xff1a;shusheng007 文章目录 概述序列化器作用和原理JDK 序列化方式多一点 String 序列化方式JSON 序列化方式 总结源码 概述 在SpringBoot中使用redis基本上都是通过Spring Data Redis&#xff0c;那就不得不说RedisTempl…

大数据--难点--地图的制作

地图一直是亮点也是难点&#xff0c;刚刚进公司的时候也很难懂~~做出来的也很难看 纯CSS3使用vw和vh视口单位实现h5页面自适应&#xff0c;gulp自动监听sass改动并保存到css中 当修改了sass里面的代码后&#xff0c;gulp会自动监听修改内容并同名保存到css文件夹中&#xff0…

MySQL8.xx一主两从复制安装与配置

搭建环境: 查看系统版本cat /etc/redhat-release [rootwww tools]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 查看内核版本cat /proc/version 目标: 一主两从 主机IP 主机名称 端口 搭建环境 安装目录192.168.1.100 docker…

祝金榜题名!64页Python基础学习手册!背完小白变大牛!

Python是一个温柔而强大的编程语言~在学习之初整个人都是小兴奋&#xff0c;学习中途遇到了各种问题但是我们坚持着。从一些基础概念的学习&#xff0c;到变量、函数、模块、流程控制、循环语句等等&#xff0c;Python的基础内容真心丰富呢~ 今天&#xff0c;给大家share一份我…