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…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
