数据库ALGORITHM = INSTANT研究过程

news2025/5/24 11:09:39

背景


偶然在团队中发现同事大量使用 ALGORITHM = INSTANT 更新字段,根据固有的理解,平时字段的更新必然会涉及到表结构的更改,印象中数据库会加入MDL锁去保证表数据的一致性。
但是听说在Mysql8.0+特性中,表明在更新字段的时候此方法不会导致锁表,因为这是一个在线的DDL的操作方式。后续带着疑问查询了大量的文章未果,依然没有理解其中的原理,固写下文研究过程。

疑问点


例如下面的DDL方式

ALTER TABLE users ADD COLUMN age INT DEFAULT 0 COMMENT '年龄', ALGORITHM=INSTANT;

在结尾处使用了【ALGORITHM=INSTANT】的字段表述方式,即可避免锁表。

f*&!思来想去,这是什么东西,难不成是传说中的“多级&叠加表”设计?我猜想:数据依然是老数据,但是新表是新表,所以查询引擎层会append一些新表结构的字段回去。

颠覆了我的认知。

研究过程


我查询了许多文章的表述,但是最终得到的更多是【Mysql8.0+特性】。显然这样的结论并不能直接说服我们对技术的渴望,偶然看到一篇帖子,恍然大悟。
记录在淘宝的【数据库内核技术2020年3月】的报刊中,我们发现研究者对这项特性是这样描述的
在实现上,MySQL并没有在系统表中记录多个版本的schema,而是非常取巧的扩展了存储格式。在已有的info bits区域和新增的字段数量区域记录了instant column信息,instant add column之前的数据不做任何修改,之后的数据按照新格式存储。同时在系统表的private_data字段存储了instant column的默认值信息。查询时,读出的老记录只需要增加instant column默认值,新记录则按照新的存储格式进行解析,做到了新老格式的兼容。当然,这种实现方式带来的限制就是只能顺序加字段。
看完后,总结以下几点
1.在原有的数据表结构和新增的字段记录了【instant column】字段信息
2.旧数据查询的时候会补充【instant column】默认值,新数据按新的结构存储

对于大佬的总结,是根据一篇mysql的官网技术worklog来进行解读的

  • 数据库worklog-instant算法
    该技术describe 第五点有个阐述

For “old” rows, the default value will be looked up from the new
system tables and appended before return to server.

翻译过来就是:

对于“旧”行,将从新系统中查找默认值表格并在返回服务器之前附加。

这句话验证了我的猜想:表里存在的旧数据,在数据返回到服务器将新的字段进行append回去,去展示对应的完整数据行。

那也就是我们在操作数据的时候,使用了ALGORITHM = INSTANT在表里使用了DDL的方式操作,那么我们将不会关注元数据的更改情况,也就是不用关心锁表。
但是也提供了【INPLACE&FORCE 】原来的复制表的方式来更新内部表,也就是锁表的方式

  • 关于Instant算法技术内幕原理
    在这里插入图片描述

对于instant算法,可看上图

  1. 假设本身存在的一张表t1 , 先存在 a字段,插入一条数据x,此时存在了x(1) 【1 = 当前的列号情况】
  2. 现在ADD COLUMN更新表增加了b字段,再次插入一条数据y,此时存在数据x(1 + 1’) +
    y(2)。最新数据y将使用所有列的情况,而x旧数据只保存了a列的字段,并没有b的,所以需要组装返回
  3. 再次ADD
    COLUMN更新表增加了c字段,再次插入一条数据z,此时存在的数据x(1+2’)+y(2+1’)+z(3)。新增了c字段后,同上步骤,此时x将新增bc列的组装返回,y新增了c列,而x会使用所有列的情况。

表达的方式类似如图最后一张。

学习到其他大佬的对sql执行过程输出,观察到在使用instant字段后对其表进行数据新增,其新增数据会在bit字段设置为1来代表数据是instant之后的。
因为对于内部执行流程 rec_set_instant_flag_new函数在记录的Info bits字段设置REC_INFO_INSTANT_FLAG,会表示这个记录是instant add column之后创建的。

使用的注意点
1.ALGORITHM = INSTANT 不能与 LOCK 子句一起使用,如果指定了 INSTANT,并且 LOCK=NONE/SHARED/EXCLUSIVE如果同时指定了 LOCK=DEFAULT,则会引发 ER_WRONG_USAGE 错误。但是,如果同时指定了 LOCK=DEFAULT,则可以。
2.ADD COLUMN 可能会立即完成,因此我们可能不会期望立即进行 ADDCOLUMN 去修复损坏的索引
3.此工作日志不支持具有全文索引的表
4.对于 EXCHANGE PARTITION,为了简化逻辑,如果分区或要交换的表是即时的,那么该操作将被拒绝错误 ER_PARTITION_EXCHANGE_DIFFERENT_OPTION
5.对于使用它进行索引的创建或者更新,算法会被降级【ALGORITHM=INPLACE】,此时涉及到锁表,进行数据文件的物理修改
6.INPLACE 算法原理(GPT):

  1. 扫描表数据,构建索引结构。
  2. 允许并发 DML 操作(如 INSERT/UPDATE/DELETE),但某些阶段可能短暂阻塞 DDL。
  3. 最终替换旧表文件,完成索引创建

总结


使用Instant字段对元数据的操作(增加/修改字段和注释等),会将旧数据新增的字段列号只能附加在表的最后,而新数据将使用新表的数据方式存储。这是一个技术突破的东西。
仔细一看,mysql的描述感谢了Tencent的付出,腾讯哥还是厉害。他们主要的优化点是【ALTER TABLE … ADD COLUMN 可以立即完成,不需要太多的 IO 和等待时间】
这个特性的诞生,意味着大家对于新增字段大表的数据结构需要去增加字段,不会像之前那样操作锁表,mysql8.0+版本随意放心食用。

5.感谢

http://mysql.taobao.org/monthly/2020/03/01/
https://dev.mysql.com/worklog/task/?spm=a2c4e.10696291.0.0.439f19a4hwOoes&id=11250

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

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

相关文章

n8n 为技术团队打造的安全工作流自动化平台

AI MCP 系列 AgentGPT-01-入门介绍 Browser-use 是连接你的AI代理与浏览器的最简单方式 AI MCP(大模型上下文)-01-入门介绍 AI MCP(大模型上下文)-02-awesome-mcp-servers 精选的 MCP 服务器 AI MCP(大模型上下文)-03-open webui 介绍 是一个可扩展、功能丰富且用户友好的…

基于Python的App流量大数据分析与可视化方案

一、引言 App流量数据通常包括用户的访问时间、停留时间、点击行为、页面跳转路径等信息。这些数据分散在不同的服务器日志、数据库或第三方数据平台中,需要通过有效的技术手段进行整合和分析。Python在数据科学领域的广泛应用,得益于其简洁的语法、强大…

【Linux 并发与竞争实验】

【Linux 并发与竞争实验】 之前学习了四种常用的处理并发和竞争的机制:原子操作、自旋锁、信号量和互斥体。本章我们就通过四个实验来学习如何在驱动中使用这四种机制。 文章目录 【Linux 并发与竞争实验】1.原子操作实验1.1 实验程序编写1.2 运行测试 2.自旋锁实验…

wx219基于ssm+vue+uniapp的教师管理系统小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

leetcode0079. 单词搜索-medium

1 题目: 单词搜索 官方标定难度:中 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字…

SvelteKit 最新中文文档教程(20)—— 最佳实践之性能

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …

在多系统环境中实现授权闭环,Tetra Pak 借助CodeMeter打造食品工业的安全自动化体系

一、 行业背景与安全新挑战 在食品加工自动化不断深化的背景下,食品安全、功能安全与知识产权保护的需求日益迫切。Tetra Pak 作为全球领先的食品加工和包装解决方案提供商,业务遍布 160 多个国家,涵盖从配料混合、碳酸化处理到全线自动包装。…

B端可视化方案,如何助力企业精准决策,抢占市场先机

在当今竞争激烈的商业环境中,企业需要快速、准确地做出决策以抢占市场先机。B端可视化方案通过将复杂的企业数据转化为直观的图表和仪表盘,帮助企业管理层和业务人员快速理解数据背后的业务逻辑,从而做出精准决策。本文将深入探讨B端可视化方…

0701表单组件-react-仿低代码平台项目

文章目录 1 react表单组件1.1 受控组件 (Controlled Components)示例代码: 1.2 非受控组件 (Uncontrolled Components)示例代码: 2 AntD表单组件实战2.1 开发搜索功能2.2 开发注册页2.3 开发登录页2.4 表单组件校验 结语 1 react表单组件 input表单组件…

【adb】bat批处理+adb 自动亮屏,自动解锁屏幕,启动王者荣耀

准备adb 下载 需要确认是否安装了adb.exe文件,可以在: 任务管理器 -->详细信息–>找一下后台运行的adb 安装过anroid模拟器,也存在adb,例如:雷电安装目录 D:\leidian\LDPlayer9 单独下载adb 官方下载地址:[官方网址] 下载目录文件: 测试adb USB连接手机 首先在设置界…

Distortion, Animation Raymarching

这节课的主要目的是对uv进行操作,实现一些动画的效果,实际就是采样的动画 struct texDistort {float2 texScale(float2 uv, float2 scale){float2 texScale (uv - 0.5) * scale 0.5;return texScale;}float2 texRotate(float2 uv, float angle){float…

SpringBoot整合POI实现Excel文件的导出与导入

使用 Apache POI 操作 Excel文件,系列文章: 《SpringBoot整合POI实现Excel文件的导出与导入》 《SpringMVC实现文件的上传与下载》 《C#使用NPOI导出Excel文件》 《NPOI使用手册》 1、Apache POI 的介绍 Apache POI 是一个基于 Java 的开源库,专为读写 Microsoft Office 格…

矩阵基础+矩阵转置+矩阵乘法+行列式与逆矩阵

GPU渲染过程 矩阵 什么是矩阵(Matrix) 向量 (3,9,88) 点乘:计算向量夹角 叉乘:计算两个向量构成平面的法向量。 矩阵 矩阵有3行,2列,所以表示为M32 获取固…

(EtherCAT 转 EtherNet/IP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

型号 协议转换通信网关 EtherCAT 转 EtherNet/IP MS-GW12 概述 MS-GW12 是 EtherCAT 和 EtherNet/IP 协议转换网关,为用户提供两种不同通讯协议的 PLC 进行数据交互的解决方案,可以轻松容易将 EtherNet/IP 网络接入 EtherCAT 网络中,方便…

分享:批量提取图片文字并自动命名文件,ocr识别图片指定区域并重命名文件名工具,基于WPF和腾讯OCR识别的接口的视线方案

一、项目背景 在处理大量图片时,常常需要从图片中提取特定区域的文字信息,并依据这些信息对图片进行重命名。例如,在档案管理领域,大量纸质文件被扫描成图片后,需要从图片中提取关键信息(如文件编号、日期等)来重命名图片,以便后续的检索和管理;在电商领域,商家可能…

Mysql读写分离(1)-服务器的设置(主从复制)

1.简介 随着网站访问和请求量的增加,单台数据库服务器的连接已耗尽,会出现连接请求还在等待,或是数据库服务器崩溃等现象,这时候我们考虑如何减少数据库的连接,可以通过优化代码、使用缓存、数据库读写分离等方式解决…

STM32F103ZET6移植FATFS文件系统教程(W25Q32)

一、FATFS核心特性 跨平台支持‌ 支持FAT12/FAT16/FAT32格式,兼容Windows文件系统‌; 采用标准C语言编写,代码量小且支持RTOS‌。 配置灵活性‌ 通过宏定义实现功能裁剪,例如: FF_FS_READONLY:设为1时禁…

STM32 模块化开发实战指南:系列介绍

本文是《STM32 模块化开发实战指南》系列的导读篇,旨在介绍整个系列的写作目的、适用读者、技术路径和每一篇的主题规划。适合从事 STM32、裸机或 RTOS 嵌入式开发的个人开发者、初创工程师或企业项目团队。 为什么要写这个系列? 在嵌入式开发中,很多人刚开始都是从点亮一个…

信刻电子档案蓝光光盘刻录安全检测长期归档

信刻一直致力于为档案馆、各行业档案部门,提供跨网数据交换、电子档案数据磁光异质备份归档解决方案。所研制的电子档案光盘智能长期归档系统,满足国产环境下”刻、管、存、检、用”全生命周期管理应用需求,能够提供一份离线归档、一份近线存…

vue3中,element-plus中el-input的v-model和value的用法示例

el-input的v-model&#xff0c;邦定响应式变量 <el-col :span"6"><el-form-item label"检验类别" prop"verifyType"><el-input v-model"applyAllInfo.applyBasicInfo.verifyTypeName" readonly /></el-form-item…