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 UPDATEINSERT IGNOREINSERT 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…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
