mysql8.0规范
MySQL 数据库开发规范
目录
- 背景与目标
- 规范列表
- 1. 库表设计
- 1.1 必须字段
- 1.2 命名规范
- 2. 定义规范
- 2.1 约束规范
- 2.2 类型规范
- 2.2.1 字段类型与长度
- 2.2.2 状态字段数据类型
- 2.2.3 布尔型
- 2.2.4 varchar和text, json
- 2.2.5 decimal(m,d)
- 3. 索引规范
- 4. 其他规范
- 5. SQL 使用
- 5.1 索引
- 5.2 查询
- 5.3 操作
- 6. SQL 版本控制
- 6.1 审核
- 1. 库表设计
- 补充说明
前言
在开发中,虽然性能大多决定于架构设计,但是合理的使用sql语句,是开发人员的必修课,今天基于mysql官方文档,给大家整理一些mysql的规定。
规范列表
规范依据约束力强弱及故障敏感性依次分为【强制】、【推荐】、【参考】三大类。
1. 库表设计
1.1 必须字段
-
约束度:【强制】
-
规范描述:
- 无特殊需求,默认使用 InnoDB 存储引擎。
- 基本约束:表设计必须有主键 id、创建时间 create_time、修改时间 update_time。
- 主键无特殊需求,使用 bigint 和 auto_increment。
- 数据库默认选取 utf8mb4 作为字符集,只有 utf8mb4 才能存放 emoji 表情符。
- 每个表的字段数不要超过 50 个(无特殊需求情况)。
- 根据更新的频繁程度决定字段的顺序。为提高数据库效率,将更新频繁程度高的字段排在表中靠前的位置,越靠后的字段效率越低。
CREATE TABLE `table_exp` (`id` bigint unsigned AUTO_INCREMENT NOT NULL COMMENT '主键ID',`package_id` int unsigned NOT NULL DEFAULT 0 COMMENT '套系id',`module_id` int unsigned NOT NULL DEFAULT 0 COMMENT '模块id',`module_name` varchar(64) NOT NULL DEFAULT '' COMMENT '模块名称',`is_delete` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '是否删除,0-未删除,1-删除,默认为0',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',PRIMARY KEY (`id`),KEY idx_package_id(package_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='模块示例表';
1.2 命名规范
- 约束度:【强制】
- 规范描述:
- 库名、表名、字段名,索引名,别名必须使用小写字母开头,使用"_"分割,不超过 30 个字符,禁止使用 MySQL 保留字,禁止使用字母、下划线和数字以外的其他字符。
- 临时库、临时表必须以
_tmp_8位日期
结尾,如:order_tmp_20160712
- 备份库、备份表必须以
_bak_8位日期
结尾,如:order_bak_20160712
- 【create|alter】table 语句不指定字符集,统一由库定义。
2. 库表设计
2.1 定义规范
- 约束度:【强制】
- 规范描述:
- 同一项目(产品)中存储相同数据的列类型必须一致,列名必须一致。
- 同业务字段在不同项目数据表需要使用同一字段名。
- 使用 DTS 同步的数据表和原表保持一致的字段定义,表名可根据业务不同。
- 同一个业务线采用统一字符集,避免隐式转换。
- 控制单库表个数,单库表个数不超过 4096 个。
- 创建数据库的语句必须包含字符集字句和默认的校验规则。
CREATE DATABASE IF NOT EXISTS my_database DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_bin;
2.2 约束规范
- 约束度:【强制】
- 规范描述:
- 所有表和字段都需要添加注释。
- 字段设置 not null 非空约束。默认值 0 或 ‘’。
2.3 类型规范
2.2.1 字段类型与长度
-
约束度:【强制**
-
规范描述:
- 合理分配字段类型和长度,字段值与类型一致避免用字符串存数字等。
`price` DECIMAL(10,2) NOT NULL;
2.2.2 状态字段数据类型
-
约束度:【强制】【推荐】
-
规范描述:
- 表示状态字段使用 TINYINT UNSIGNED,禁止使用枚举类型定义,
- 注释必须清晰地说明每个状态的含义,以及是否多选等。
`status` TINYINT UNSIGNED NOT NULL COMMENT '1: 启用,0: 禁用';
2.2.3 布尔型
-
约束度:【强制】【推荐】
-
规范描述:
- 注释必须清晰地说明每个值的含义。
- 表达是否概念或有限 list 的,应该用 unsigned tinyint。
`is_active` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '1: 启用,0: 禁用';
2.2.4 varchar和text, json
- 约束度:【强制**
- 规范描述:
- 可变长度 varchar 类型,长度不建议超过 1000。如果超过 4000,必须分离到单表,以主键和主表关联,避免影响其他字段的数据效率。
- text 字段类型,必须分离到单表,以主键和主表关联,避免影响其他字段的数据效率。
2.2.5 decimal(m,d)
- 约束度:【强制**
- 规范描述:
- 价格或需要精确数值的字段使用 decimal,避免使用 float 或 double。
3. 索引规范
- 约束度:【强制**
- 规范描述:
- 一两个的查询字段和关联字段、where 字句字段可以考虑建立覆盖索引。
- 唯一索引使用
uk_[字段名]
来命名; - 非唯一索引使用
idx_[字段名]
来命名。 - 长字符串采用前缀索引,长度通过
count(distinct left(col_name,n))/count(1)
来计算,达到 90% 即可。 - 使用组合索引,字段顺序按区分度高低排列(满足最左匹配原则为优先)。
- 索引必须创建在索引选择性较高的列上。
- 联合索引的第一个字段,必须在 where 子句中。联合索引中将索引选择性高的字段靠前放。
- 禁止使用外键。容易产生死锁,且影响性能。
- TEXT 类型字段必须使用前缀索引。
- 单表的索引数量控制在 7 个以内,把索引建在 SELECT 操作比较频繁且数据量大的表,经常有大批量插入、更新操作的表尽量少建索引。组合索引的字段数不超过 5 个。
- 禁止对过长的 VARCHAR 类型字段建立索引。MySQL 的 VARCHAR 索引只支持不超过 768 个字节,utf8 一个字符三字节,即:768/3=256,所以最长支持 255 个字符的字段创建索引。除了前缀索引外超过 32 字符的 VARCHAR 列加索引需要 DBA 评估。
4. 其他规范
- 约束度:【强制**
- 规范描述:
- 禁止使用存储过程、触发器、视图、Event、自定义函数、外键约束。
- 无特殊需求,严禁使用分区表。
- 进行大批量操作时必须分批提交,每次数据量操作不能超过 10 万条。
LAST_INSERT_ID()
函数只能返回当前 SESSION 最近一次 INSERT 操作之后所使用到的AUTO_INCREMENT
类型字段的值。- 用
IN()
/UNION
替代OR
,并注意IN
的个数不要超过 300,IN
的性能高于OR
,而EXISTS
/NOT EXISTS
比IN
/NOT IN
性能更优。 - 使用 LOCATE()、POSITION()、INSTR()、FIND_IN_SET() 的性能稍微优于 LIKE。
- 使用
PREPARED STATEMENT
可以提高性能并避免 SQL 注入。 - 严禁开发使用
LOCK TABLE
进行人为锁表,仅允许使用SELECT ... FOR UPDATE
语句。 - WHERE 条件尽可能避免非等值条件,
IN
、BETWEEN
,<
,<=
,>
,>=
会导致后面的条件使用不了索引。 - 使用
UNION ALL
代替UNION
。 UPDATE
、DELETE
语句不要使用 LIMIT。- INSERT 语句必须指明字段名称,避免后期因为字段扩展而影响原有应用程序。
- INSERT 使用 BULK 提交,VALUES 的个数不宜过多。BULK 提交可以提高写的效率。
- 拆分复杂的 SQL 为多个小 SQL,避免大事务。
- 尽量采用批量 SQL 语句:
INSERT ... ON DUPLICATE KEY UPDATE
INSERT IGNORE
INSERT INTO VALUES()
REPLACE INTO
- 对同一个表的多次 ALTER 操作必须合并为一次操作,开发使用 ALTER 需要 DBA 进行严格审核。
5. SQL 使用
5.1 索引
- 约束度:【强制**
- 规范描述:
- WHERE 字段列禁止使用表达式或函数,它们不会使用该列上的索引,如:WHERE
month(create_time)=1
或where num+1=100
。 - 禁止使用
IS NULL
或IS NOT NULL
。 - OR 两边字段都应该有索引。
- 两百万以上大表禁止使用全模糊查询,如
LIKE '%keywork%'
。此类业务推荐使用搜索引擎或者全文索引。 - 对于电话等末位匹配查询,推荐反向存储数值,查询时采用“前缀”。
- WHERE 字段列和字段值类型应该一致,避免隐式转换。
- 区间查询应该使用封闭区间,避免 [-∞,n] 和 [n,+∞] 不可控范围。
- WHERE 字段应该根据统一补充条件,避免索引过度。
- WHERE 字段列禁止使用表达式或函数,它们不会使用该列上的索引,如:WHERE
5.2 查询
- 约束度:【强制**
- 规范描述:
- 只允许 2 表关联,禁止使用 3 个表及以上的关联查询。
- 关联查询时,被关联的字段需要有索引,多字段关联应该使用联合索引,关联字段数据类型和字符集必须一致避免索引失效。
ORDER BY
语句必须跟LIMIT n
限制条件。- 统计查询禁止使用
ORDER BY
。
5.3 操作
- 约束度:【强制**
- 规范描述:
- 代码中禁用
SELECT *
,必须指定列名。
SELECT column1, column2 FROM table_name;
- 所有内连接的 SQL 语句必须使用
INNER JOIN(JOIN) ... ON ..
,外连接必须使用LEFT JOIN(LEFT OUTER JOIN) ... ON
。不使用RIGHT JOIN
。 - 代码中
INSERT INTO table
必须指定列名与值的对应关系。
- 代码中禁用
6. SQL 版本控制
6.1 审核
- 约束度:【强制**
- 规范描述:
- 版本上线更新,必须提供 SQL 原型文件进行审核。
- SQL 脚本变更和初始化必须存储在代码仓库版本的同一级目录,建立单独的目录。
lshm_admin_v1.0.0.0_liaozr_20201121_001.sql
为初始全量 SQL 脚本,下一个 SQL 脚本为差异 SQL 脚本,按版本号顺序依次迭代。
补充说明
- rowid 生成器:举例 雪花算法。
- 数据库设计示例:建议覆盖所有规约项。
- 集中业务字段:将常用的基础业务字段集中管控起来(字段名、字段标题、字段类型、字段长度),方便业务统一。
附录 1: 字段定义长度与数据页及效率的计算
因为 MySQL 是索引组织表,所以常规情况下,操作 MySQL 的表都是根据索引进行的,即使全表扫描,也是如此。索引通常用 B+树 来实现。
数据只保存在绿色的叶子结点,非叶子结点都是用来索引叶子结点的。
假设索引高度为 h,那么每次索引查询都要查询 h 个索引页面才能找到叶子结点的索引数据。
假设每行记录大小为 1KB,则每个叶子页面可以容纳 16 行,则总共可索引的行数为100W*16=1600W!
在高度 h=4 时,总行数=1000^3*16=160亿条!
对于 bigint 的主键表来说,通常索引树的高度在 2~4 个。
索引字段的数据类型越简单,效率越好。例如:int 或 tinyint,索引效率会更好,而 varchar(40) 等类型的扇出系数就低一些,所以索引效率也会低些。
相关文章:
mysql8.0规范
MySQL 数据库开发规范 目录 背景与目标规范列表 1. 库表设计 1.1 必须字段1.2 命名规范 2. 定义规范 2.1 约束规范2.2 类型规范 2.2.1 字段类型与长度2.2.2 状态字段数据类型2.2.3 布尔型2.2.4 varchar和text, json2.2.5 decimal(m,d) 3. 索引规范4. 其他规范5. SQL 使用 5.…...
现代前端架构介绍(第三部分):深入了解状态管理层及其对前端App的影响
远离JavaScript疲劳和框架大战,了解真正重要的东西 在第二部分中,我们讨论了功能架构的三个层次。其中一个就是状态管理层,今天我们将对其进行更深入的探讨。下面是现代前端架构系列的第三部分和最后一部分介绍。 状态管理,你可能…...
NLP与搜广推常见面试问题
1 auc指标 AUC的两种意义 一个是ROC曲线的面积另外一个是统计意义。从统计学角度理解,AUC等于随机挑选一个正样本和负样本时,模型对正样本的预测分数大于负样本的预测分数的概率。下图为搜广推场景下的一个计算auc的例子 2 GAUC指标 就是在推荐系统…...
Python怎么实现协程并发呢?
在Python中,实现协程并发主要是通过asyncio库来完成的。asyncio是Python 3.4中引入的标准库,用于编写单线程的并发代码。使用async和await关键字,你可以定义协程和等待其他协程的完成,而不需要创建额外的线程或进程。 下面是一个使…...
专治408开始的晚!8月一定要完成这些事!
八月份才开始408,那到考试最多也只有4-5个月的时间 别担心,可以复习两轮! 其实我一直建议大家408复习三轮,但是如果时间不够,那就要在复习质量上下功夫! 考408有一个好处,就是不用先确定学校…...
计算机毕业设计选题推荐-校内跑腿业务系统-Java/Python项目实战
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...
Unity命名验证工具类
在Unity开发中,经常需要验证变量名是否符合命名规范,同时避免使用C#的保留字作为变量名。本教程将演示如何创建一个简单的工具类来实现这一功能。 步骤 1:创建Unity命名验证工具类 首先,我们创建一个C#类,命名为Unit…...
基于cubeMX的STM32开启SPI及DMA
1、打开cubeMX后,设置SPI,如下图 2、设置SPI的DMA中断 3、DMA设置 4、SPI的GPIO设置 5、最后生成代码,可以看到工程文件中有dma.c和spi.c 6、使用举例:如幻彩灯的亮灭使用SPIDMA产生的信号波形来控制,在ws2812.c中调用…...
AI大模型技术的四大核心架构分析
AI大模型技术的四大核心架构演进之路 随着人工智能技术的飞速发展,大模型技术已经成为AI领域的重要分支。 深度剖析四大大模型技术架构:纯粹的Prompt提示词法、Agent Function Calling机制,RAG(检索增强生成)及Fine-…...
[C#]调用本地摄像头录制视频并保存
AForge.NET是一个基于C#框架设计的开源计算机视觉和人工智能库,专为开发者和研究者设计。它提供了丰富的图像处理和视频处理算法、机器学习和神经网络模型,具有高效、易用、稳定等特点。AForge库由多个组件模块组成,包括AForge.Imaging&#…...
opencv-图像基础变换
1,缩放 缩放是对图像的大小进行调整 缩放矩阵,相当于x和y乘一个常数 例如将图像放大两倍 import cv2 img cv2.imread(1.jpg) img cv2.resize(img, (400,400)) img cv2.resize(img, (0,0), fx3, fy1)#表示x方向扩大三倍,y方向不变 2&…...
xss漏洞(三,xss进阶利用)
本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 1,本文基于dvwa靶场以及PHP study进行操作,靶场具体搭建参考上一篇: xss漏洞(二,xss靶场搭建以及简单…...
git 迁移仓库的方法
git Git是一个开源的分布式版本控制系统,由Linus Torvalds在2005年创建,用于有效、高速地处理从小到大的项目管理。它最初是为Linux内核开发而设计的,但很快被广泛用于各种项目。 以下是Git的一些主要特性: 分布式架构ÿ…...
C# Where关键字
1. 泛型约束(Generic Constraints) 在泛型类、接口或方法的定义中,where关键字用于指定类型参数的约束。这些约束可以确保类型参数具有某些特定的属性。例如它是一个类、实现了某个接口、是另一个类型的派生类、具有无参构造函数等。 1.1 …...
《计算机组成原理》(第3版)第1章 计算机系统概论 复习笔记
第1章 计算机系统概论 一、计算机系统简介 (一)计算机的软硬件概念 1.计算机系统由“硬件”和“软件”两大部分组成 (1)所谓“硬件”,是指计算机的实体部分,如主机、外部设备等。 ࿰…...
达梦数据库的系统视图v$cachers
达梦数据库的系统视图v$cachers 达梦数据库的系统视图V$CACHERS的作用是显示缓存中的项信息,在 ini 参数 USE_PLN_POOL !0 时才统计。这个视图帮助数据库管理员监控和分析缓存的使用情况,优化数据库性能。通过查询V$CACHERS视图,可以获取缓存…...
电路元件基本知识详解
电路元件基本知识详解 在现代电子技术中,电路元件是构成各种电子电路的基本单元。它们各自具有不同的特性和功能,通过不同的连接方式实现多种多样的电路功能。本文将详细介绍几种常见的电路元件及其基本知识。 ### 一、电阻器 #### 1. 电阻器的基本概…...
从零开始写一个微信小程序
从零开始写一个微信小程序可以分为几个步骤。以下是一个详细的指南,帮助你从头到尾完成一个简单的微信小程序。 ### 一、准备工作 1. **注册微信小程序账号**: - 前往[微信公众平台](https://mp.weixin.qq.com/)注册一个小程序账号。 - 进行企业认证(个人账号需要申…...
07030405复杂可编程逻辑器件CPLD现场可编程阵列FPGA
复杂可编程逻辑器件CPLD&现场可编程阵列FPGA 7.3 复杂可编程逻辑器件CPLD7.3.1CPLD的结构 7.4现场可编程门阵列FPGA7.4.1FPGA实现逻辑功能的基本原理7.4.2FPGA结构简介1.可编程逻辑块2.I/O块3.可编程连线资源CPLD与FPGA的区别 7.5可编程逻辑器件开发过程简介编程条件 7.3 复…...
《雅思口语真经总纲1.0》话题实战训练笔记part1——5. Bus or taxi
《雅思口语真经总纲1.0》笔记——第四章:口语素材大全(part1、part2、part3回答准则及练习方法,不包括范例答案)★★★★★ 文章目录 Bus or taxiHou often do you take the bus?20240803答评价疑问 When was the first time you…...
《工程检索增强生成系统时的七个失败点》论文 AI 解读
周末使用 AI 速度了一篇 RAG 相关的论文,文中提到的【设计 RAG 系统时需要考虑的七个失败点】非常有价值,简单整理一下分享出来,大家如果感兴趣可以继续阅读原文。 论文名称:Seven Failure Points When Engineering a Retrieval A…...
每日一题——贪心算法
1005. K 次取反后最大化的数组和 - 力扣(LeetCode) 题解: 一开始有点理解错他的意思,以为是i是题目中会给出,所以一开始没有什么思路,然后当看了题解之后,就知道了原来i是自己订的,…...
Artix7系列FPGA实现SDI视频编解码+图像缩放+多路视频拼接,基于GTP高速接口,提供4套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的FPGA图像缩放方案本博已有的已有的FPGA视频拼接叠加融合方案本方案的无缩放应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用 3、详细设计方案设计原理框图S…...
HTTP 状态码详细介绍
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内…...
React前端面试每日一试 5.什么是受控组件和非受控组件?
在React中,受控组件和非受控组件是两种处理表单数据的方式。理解这两种方式对于管理和维护表单状态非常重要。 受控组件(Controlled Components) 受控组件是指那些表单数据完全由React组件的状态控制的组件。也就是说,表单元素的…...
代码随想录打卡第四十四天
代码随想录–动态规划部分 day 44 动态规划第11天 文章目录 代码随想录--动态规划部分一、力扣1143--最长公共子序列二、力扣1035--不相交的线三、力扣53--最大子数组和四、力扣392--判断子序列 一、力扣1143–最长公共子序列 代码随想录题目链接:代码随想录 给定…...
【JAVA】枚举类的使用:通过枚举类名称得到对应值进行输出
枚举类其实就是一个特殊的class。 /*** ClassName: CardType* Description:数字卡类型对应的文字卡类型*/ public enum CardType {NORMAL_CARD("金普卡"),BUSINESS_CARD("商务卡"),PRIVATE_CARD("黑金无限卡");private String cardName;CardTyp…...
20240731软考架构------软考6-10答案解析
每日打卡题6-10答案 6、【2012年真题】 难度:一般 若系统中的某子模块需要为其他模块提供访问不同数据库系统的功能,这些数据库系统提供的访问接口有一定的差异,但访问过程却都是相同的,例如,先连接数据库,…...
学习记录——day25 多线程编程 临界资源 临界区 竞态 线程的同步互斥机制(用于解决竟态)
目录 编辑 一、多进程与多线程对比 二、 临界资源 临界区 竞态 例1:临界资源 实现 输入输出 例2:对临界资源 进行 减减 例子3:临界资源抢占使用 三、线程的同步互斥机制(用于解决竟态) 3.1基本概念 3.2线…...
[RK3566]linux下使用upgrade_tool报错
linux下使用upgrade_tool报错Creating Comm Object failed! Rockusb>uf /home/zhuhongxi/RK3566_AOSP_SDK/rockdev/Image-rk3566_tspi/update.img Loading firmware... Support Type:RK3568 FW Ver:b.0.00 FW Time:2024-08-03 12:00:09 Loader ver:1.01 Loader Time:…...
瓷砖网站建设/网络推广具体内容
matlab常用的几个适应度评价函数分析/niuyongjie/article/details/1619496?粒子群算法(6)-----几个适应度评价函数下面给出几个适应度评价函数,并给出图形表示????? 头几天机子种了病毒,重新安装了系统,不小心把程序全部格式化了&#…...
手工做环保衣的网站/互联网网站
1、file_get_contents() 函数把整个文件读入一个字符串中。 file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。 file_get_contents(path,include_path,context,start,max_length) 参…...
网站开发背景怎么写/西安做网站公司
本节书摘来自异步社区出版社《相关性准则——大数据时代的高效能之道》一书中的第1章,第1.6节,作者:【意】Stefania Lucchetti,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.6 相关性准则 相关性准则——大数据时代的…...
影楼网站推广/软文范例200字
1、首先确定测试范围,测试设计,测试模块,再根据每个测试模块输出测试用例, 即:先确定要测试什么,测试哪些东西,要测试这些东西又要分别怎么测试,通过什么方法测试,这种方…...
wordpress什么环境速度/百度关键词seo外包
HTML元素 开始标签常被称为起始标签(opening tag),结束标签常称为闭合标签(closing tag) HTML 文档由嵌套的 HTML 元素构成 以上实例包含了七个 HTML 元素 <Html>元素,拥有开始标签 <html> &am…...
湖南做网站360o/最好用的磁力搜索神器
导语 很多情况下,为了能够观察到数据之间的内部的关系,可以使用绘图来更好的显示规律。 比如在下面的几张动图中,使用matplotlib中的三维显示命令,使得我们可以对于logistic回归网络的性能与相关参数有了更好的理解。 下面的动图…...