【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化

server/2024/10/8 8:07:54/

【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化

  • 阿里 MySQL 命名规范
  • MySQL8 DDL的原子化

在这里插入图片描述

阿里 MySQL 命名规范

  • 强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
    • 正例:aliyun_admin,rdc_config,level3_name
    • 反例:AliyunAdmin,rdcConfig,level_3_name
  • 强制】禁用保留字,如 desc、range、match、delayed 等,请参考 MySQL 官方保留字。
  • 强制】表必备三字段:id, gmt_create, gmt_modified。
    • 说明:其中 id 必为主键,类型为BIGINT UNSIGNED、单表时自增、步长为 1。gmt_create, gmt_modified 的类型均为 DATETIME 类型,前者现在时表示主动式创建,后者过去分词表示被动式更新
  • 推荐】表的命名最好是遵循 “业务名称_表的作用”。
    • 正例:alipay_task 、 force_project、 trade_config
  • 推荐】库名与应用名称尽量一致。
  • 【参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。
对象年龄区间类型字节表示范围
150岁之内tinyint unsigned1无符号值:0到255
数百岁smallint unsigned2无符号值:0到65535
恐龙化石数千万年int unsigned4无符号值:0到约43亿
太阳约50亿年bigint unsigned8无符号值:0到约10的19次方

MySQL8 DDL的原子化

MySQL 8.0引入了DDL(数据定义语言)的原子性特性,通过统一数据字典DD和DDL_LOG机制来确保DDL操作的原子性。

  1. 原子DDL的定义:原子DDL语句将数据字典更新、存储引擎操作和与DDL操作相关联的二进制日志写入组合成单个原子操作。这意味着,即使服务器在操作过程中停止运行,操作也可以提交,将适用的更改保存到数据字典、存储引擎和二进制日志中,或者回滚。

  2. 数据字典的统一:在MySQL 8.0之前,元数据存储在元数据文件、非事务表和存储引擎特定的字典中,这需要中间提交。MySQL 8.0引入了统一的数据字典DD,并废弃了server层的元数据(如.frm、.opt、.par、.trg等),将InnoDB的元数据抽象出一条DD接口供server层和InnoDB层共用。这消除了中间提交的障碍,使得将DDL语句操作重构为原子操作成为可能。

  3. DDL_LOG机制:为了确保DDL操作的原子性,MySQL 8.0还引入了一套DDL_LOG机制。在执行DDL的过程中,会记录DDL操作到DDL_LOG表中。DDL_LOG表是InnoDB引擎表,通过保证DDL_LOG数据与DD数据字典修改达成一致,来解决DD数据字典修改、引擎层修改和写binlog一致性问题。在DDL事务提交后,会读取DDL_LOG内容并进行回放执行,以完成DDL操作的收尾动作。

  4. 原子DDL的特性

    • 原子DDL支持表DDL语句和非表DDL语句。与表相关的DDL操作需要存储引擎支持,目前只有InnoDB存储引擎支持原子DDL。
    • DDL语句,无论是原子的还是其他的,都会隐式地结束当前会话中任何活动的事务。这意味着DDL语句不能在另一个事务中执行,不能在事务控制语句(如START TRANSACTION)中执行,或者与同一事务中的其他语句结合使用。
    • 原子化的DDL操作在执行过程中,如果MySQL服务突然停止,不会像之前的版本那样生成一个报错文件,而是会回滚操作。

综上所述,遵循阿里MySQL命名规范可以提高数据库的可读性和可维护性,而MySQL8 DDL的原子化特性则确保了DDL操作的一致性和可靠性。


http://www.ppmy.cn/server/126390.html

相关文章

初识C语言(五)

前言 本文章就代表C语言介绍以及了解正式完成,后续进行具体分析和详细解析学习。知识根深蒂固才可以应付后来的学习,地基要打好,后续才会轻松。 十四、结构体 结构体是C语言中最最重要的知识点,使得C语言有能力描述复杂的类型。 …

OpenCV库 详细常见操作

在PyCharm中使用OpenCV时,可以访问OpenCV库提供的丰富函数来进行图像处理和计算机视觉任务。以下是一些常用的OpenCV库函数及其简要说明: 一、图像读取与显示 cv2.imread():读取图像文件。cv2.imshow():在一个窗口中显示图像。c…

vuepress 浏览器加载缓存,总是显示旧页面,无法自动刷新数据的解决方法

vuepress 采用多页面形式,每个md文件在打包时,都会被转为一个html页面;而浏览器默认会缓存页面,导致更新的页面必须手动刷新才行 对于更新较为频繁的文档 全局可在config.js里设置 参考文档: https://vuepress.github.io/zh/ref…

闯关训练一:Linux基础

闯关任务:完成SSH连接与端口映射并运行hello_world.py 1.创建开发机 2.SSH连接 3. VS-Code 连接 选择 Linux 平台 ,输入密码 ,选择进入文件夹 4.端口映射 按照下文安装Docs pip install gradio 运行server.py import gradio as grdef …

NullPointerException底层源码分析

NullPointerException 是 Java 编程中一个常见的运行时异常,通常在尝试访问或操作一个为 null 的对象引用时抛出。下面是一些常见原因及解决方法: 常见原因 未初始化的对象:如果对象在使用前没有被实例化,就会引发 NullPointerEx…

Linux之进程概念

作者主页: 作者主页 本篇博客专栏:Linux专栏 创作时间 :2024年9月28日 基本概念: 进程说白了其实就是一个程序的执行实例,正在执行的程序。 在内核层面来说,就是一个担当分配资源(CPU时间…

cfg80211是怎么配置无线设备的AP的?

cfg80211 概念 cfg80211 是 Linux 内核中一个用于无线网络的配置和管理的子系统,它为多个无线网络驱动提供了一个统一的接口,以便于无线设备的配置和操作。cfg80211 的设计目标是提供一个简化的管理和配置无线设备的框架,同时支持多种无线设…

OpenCV视频I/O(3)视频采集类VideoCapture之获取当前使用的视频捕获 API 后端的名称函数getBackendName()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 getBackendName 函数是 OpenCV 中 VideoCapture 类的一个方法,用于获取当前使用的视频捕获 API 后端的名称。这可以帮助开发者了解当…