Innodb引擎的表上更换主键会发生什么

MYSQL-INNODB索引构成详解 对于MYSQL的INNODB存储引擎的索引,大家是不陌生的,都能想到是 B+树结构,可以加速SQL查询。但对于B+树索引,它到底“长”得什么样子,它具体如何由一个个字节构成的,这些的基础知识鲜有人深究。本篇文章从MYSQL行记录开始说起,层层递进,包括数据页,B+树聚簇索引,B+树二级索引,最后在文章末尾给出MYSQL索引的建议。文章涉及较多基础知识,内容较为枯燥,因此采用较多的图片补充说明,希望能对读者有帮助。 阅读详情

数据库的问题,如果不去深入思考,可能还真的只是一知半解,以前用Oracle的时候,也是经过几年不断地去探究其内部实现的原理,才真正明白了在Oracle数据库上做某个操作或者做某个配置的合理的方法。现在又到了国产数据库和开源数据库当道的时代了,我们不仅仅需要去研究一个Oracle数据库而是要去研究数个甚至数十个数据库了,这对于DBA来说是一件十分悲哀的事情。想起当年Poder说过的我这辈子只要干好Oracle数据库优化一件事就可以了,不知道这种数据库群雄并起的时代,对我们DBA来说是好事还是坏事了。

天底下的事情就怕较真,昨天一个客户咨询如果在一个MYSQL数据库上更换PRIMARY KEY,会发生什么?所有的索引都必须重建吗?这个问题似乎答案很简单,对于普通的堆表来说,主键更换不会影响其他索引,而对于Mysql innodb这样的BTREE表来说,所有的Secondary index里存储的不是数据行的物理地址,而是主键的键值,那么一旦主键更换了,那么所有的Secondary index就都必须重建了。不过这似乎太不合理了,真的会发生这样的事情吗?如果我们的表上面有好多个Secondary index,而且表的数据量很大,这样的操作似乎太消耗资源了?Innodb会不会采取更为巧妙的方法来处理这个问题呢?从一个架构师的角度,我首先就拒绝这样的设计,如果真的是这样,Innodb更换主键的成本就太高了。

innodb是采用BTREE存储结构的。因此在一张表的数据中分为两个段,一个段是主键索引段,被称为cluster primary key,一个段是数据段。

七月份的时候我发过一篇文章,讨论了BTREE结构表的一些基本结构,实际上MYSQL、达梦等数据库都使用了这种结构。采用这种存储结构的数据库有两个特点:首先,表中以主键值的顺序物理存储行。这意味着主键不仅唯一标识一行,而且还是它的一部分。或者更确切地说,物理行是表主键的一部分;其次,二级索引条目不指向实际的行位置,每个二级索引条目中存储的都是主键的值。当查询通过二级索引读取一行时,这个值被主键用于额外的隐式查找,以定位实际的行。

基于这样的底层存储结构,在设计MYSQL表的主键的时候,也有许多优化的原则,比如说,主键的键值尽可能地短,从而提高主键地效率。另外一点是选择主键的时候,尽可能选择增长趋势的字段作为主键(比如自增字段),因为innodb的行是按照主键的顺序插入的,采用自增的主键,有助于减少大量数据插入时的碎片产生,避免不必要的PAGE分裂,从而提高高并发插入的性能。当然你的数据库的负载没有那么大的时候,这些也不会成为一个主要的问题。

实际上,对于用惯了Oracle数据库的认,我们很可能在使用MySQL数据库上犯下错误。对于大量做范围扫描的应用来说,大家可能已经忘记了索引的一个重要的属性,cluster factor,一条索引的cluster factor越大,则做范围扫描的成本越高。对于Oracle这样的HEAP存储结构的数据库来说,插入数据是是有一定的随机性的,不过总体来说还是顺序添加为主。因此如果一个索引的扫描是和数据插入的性状相类似的时候,索引的cluster factor会比较小,扫描的总体成本会比较小。而对于BTREE存储结构的表,其行存储的位置和主键索引有关,因此如果MYSQL的索引也按照ORACLE那样去计算一个CLUSTER FACTOR的话,针对于范围扫描,其性能特征会和Oracle不同。当然,随着现在硬件的发展,存储性能的提升,CPU处理能力的巨大提升,这点系统开销往往可以被我们忽略,不过对于一些高并发,高负载,超大数据量的环节,MYSQL的这个特性的差异还是需要被我们重视。我们如果采用类似Oracle优化CLUSTER FACTOR的方法来优化数据存储,是不会获得和ORACLE一样的优化效果的。关于Oracle的CLUSTER FACTOR问题,我以前在《DBA的思想天空》这本书中讨论过,有兴趣的朋友可以去翻看。

前面谈了一些似乎和今天的话题不相干的问题,我们还是回到问题本身,那就是在INNODB上更换主键,会发生什么?

实际上我们潜意识里的想法就是正确的答案,刚开始我对更换主键的想法是有点想多了。实际上,当我们在MYSQL上创建一张表的时候,如果没有指定主键,则INNODB引擎会自动在表中找到非空唯一性的字段,在上面创建一个主键索引作为CLUSTER PRIMARY KEY。如果找不到,则会创建一个6字节的自增量,用这个自增量来创建CLUSTER PRIMARY KEY,这是因为INNODB的表上必须要有一个索引段。Secondary Index中的所有索引项都要指向这个索引段。有兴趣的朋友可以做个实验,创建一张无法选出主键的表的时候,我们会发现这张表上回自动产生一个GEN_CLUSTER_INDEX的UNIQUE索引,作为该表的主键。当我们在表上添加一个主键后,这个索引就会被删除,用新的主键字段创建一个新的unique索引来替代。当当我们修改INNODB表上的主键时,老的主键和UNIQUE索引会被删除,新的索引会被创建。根据INNODB的SECONDARY INDEX的设计原理,那么在主键更换的时候,二级索引是必须重建的。这也导致了在INNODB上更换主键是一个十分高开销的操作。

最后要说的一点是,如果你真的要在INNODB上更换主键,先删除老的主键,后创建新的主键是一种不可取的操作,因为删除老主键的时候,主键索引被删除,GEN_CLUSTER_INDEX会被创建,所有的二级索引会被重建。添加新主键的时候,GEN_CLUSTER_INDEX会被删除,主键索引会被创建,二级索引要再次重建。正确的做法是:ALTER TABLE DROP PRIMARY KEY ,ADD PRIMARY KEY TEST_TABLE(TEST_COL)。

明白了上面的原理,那么当我们在修改主键的时候,遇到#1878 - Temporary file write failure.这样的问题也不会一头雾水了,你知道MYSQL在干什么。

虽然讲了这么多,似乎在这方面MYSQL的设计不是很合理,是的,不合理,不过这是权衡多种因素的结果,这种不合理是为了其他方面更为合理,因为修改主键在实际已上线的生产系统中应该是个小概率事件。我们既然要用MYSQL,就应该对此早有准备,在设计数据表的时候就认真考虑好主键的问题。

Moveit Servo学习 MoveIt Servo功能与配置指南 摘要:本文介绍了MoveIt Servo的功能特性,包括支持关节速度、末端执行器速度和位置控制,以及安全功能如奇点检查、碰撞检测等。通过示例展示了如何运行伺服控制demo,详细解析了关键节点和话题。最后以睿尔曼rml_63机器人为例,讲解了如何自定义伺服配置文件,包括环境设置、输入输出参数配置、平滑滤波器和规划场景监控等关键配置项。文章提供了从基础使用到自定义机器人配置的完整指导,帮助开发者实现高效的实时运动控制。 阅读详情

相关推荐

Prometheus+Grafana+alertmanager+PrometheusAlert监控告警 实现飞书告警

以上 是以grafana做的邮件告警,但是感觉邮件很少人看。下面是以webhook 可以接入。启动alertmanager (设置 开机在启动)下载prometheusalter 配置文件。这里的告警是基于grafana上搭建的。我们启动PrometheusAlert。写完之后进行重启Prometheus。prometheus 的告警规则。测试 基于我们生产环境做的文档。然后在grafana上导模板。上导入模板就可以 直接引用。访问 grafana页面。重启一下grafana。

墨痕诉清风的博客 858

完整表修改主键的问题

--第一如果主键在已有列中建立  默认插入的第一个索引是0--如果主键是自增的那么默认插入的第一个索引是1--如果有索引值有0自增主键会将其置换为1--如果此时已经有1那就会报错--如果没有不合适的键那么就会总最后递增--如果有1个NULL值此时设置为主键会将NULL置换为0,实际上是nut noll 将其置换为0的--DUPLICATE entry '0' FOR KEY 'PRIMARY'  ...

不以人人的意志为转义乃天道 352

22、光无线通信调制技术详解

本文详细介绍了光无线通信中的多种调制技术,包括开关键控(OOK)、脉冲位置调制(PPM)、数字脉冲间隔调制(DPIM)、副载波强度调制(SCM)、相移键控(PSK)、正交幅度调制(QAM)以及多载波调制(MCM)如OFDM和MSIM。文章分析了各类调制技术在带宽需求、功率效率、传输容量、传输速率和PAPR等方面的性能差异,并通过Matlab仿真展示了其在AWGN信道下的误码率表现。同时,对比了不同技术的适用场景,提出了调制选择流程,并结合室内光通信与自由空间光通信的应用案例,展望了未来调制技术向高频谱效率、

net55的博客 116

【MySQL】索引

学习于极客时间 哈希索引 哈希索引做区间查询是很慢的,哈希表适用于只有等值查询的场景,比如 Memcached 及其他一些 NoSQL 引擎。 有序数组索引 有序数组在等值查询和范围查询场景中的性能就都很好。 如果仅仅看查询效率,有序数组就是最好的数据结构了。但是,在需要更新数据的时候就麻烦了,你往中间插入一个记录就必须得挪动后面所有的记录,成本太高。 有序数组索引只适用于静态存储引擎,比如你要保存的是省市这类几乎不会再修改的数据。 二叉树索引 二叉树为了维持 O(log(N)) 的查询复杂

keeper42的博客 1444

threejs中使用Reflector实现出倒影效果,并实现背景透明的效果(Reflector镜面背景透明, 倒影弱化)

在项目中遇到要实现倒影效果,threejs给我们提供了Reflector,可以轻松完成镜面效果,实现倒影。但背景不透明;并且反射出的倒影太亮了;网上没搜到解决方案, 自己修改了下源码实现了想要的效果,做个记录...

weixin_40856652的博客 5721

YOLOv5 实现 10 种热力图可视化方式教程 | GradCAM XGradCAM ScoreCAM LayerCAM HiResCAM EigenCAM....

基于梯度计算类激活图,是最经典的热力图生成方法之一。Grad-CAM的改进版,通过引入梯度加权的方式,提高了热力图的定位精度。基于类别的得分计算类激活图,对噪声具有更强的鲁棒性。基于特定层的特征图计算类激活图,可以灵活选择不同的层进行分析。通过上采样将低分辨率的特征图恢复到原始图像大小,提高了热力图的分辨率。基于特征图的特征向量进行PCA降维,得到更简洁的热力图。对Grad-CAM的进一步改进,通过加权平均的方式,提高了热力图的质量。基于积分梯度的方法,可以解释模型对输入的每个特征的贡献。

weixin_39818775的博客 2374

为什么推荐InnoDB引擎使用自增主键?

原文地址:http://www.ywnds.com/?p=8735 在使用InnoDB存储引擎时,如果没有特别的需要,请永远使用一个与业务无关的自增字段作为主键,除非高并发写入操作可能需要衡量自增主键,后面会讲。 经常看到有帖子或博客讨论主键选择问题,有人建议使用业务无关的自增主键,有人觉得没有必要,完全可以使用如学号或身份证号这种唯一字段作为主键。不论支持哪种论点,大多数论据都是业务

奋斗、 9467

在 ABAP 平台上搭建 OAuth 2.0 Server:架构、流程、权限与落地实战

摘要:本文为SAP ABAP开发人员提供将ABAP平台配置为OAuth 2.0授权服务器的实战指南。重点介绍两种授权流程(授权码和SAML Bearer)的实现方案,包括核心事务配置(SOAUTH2/SAML2)、授权对象(S_SCOPE)管理以及端点交互规范。通过具体配置清单和三类典型集成场景(第三方Web应用访问OData、企业集成平台调用、BTP应用对接)的落地示例,帮助读者快速构建安全的OAuth 2.0服务架构。文档强调SSL/TLS基础安全、scope最小授权原则以及授权与令牌端点的标准交互模式

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 309

mysql 修改主键

ALTER TABLE `test2` DROP PRIMARY KEY ,ADD PRIMARY KEY ( `id` ) 重设主键字段 有时数据库操作时需要将一个主键修改为联合主键或者把主键改为其他列,这时候单纯的add primary key是没有用的,必须先删除主键约束再重新添加。 MYSQL: 1、alter table TABNAME drop primary key; 2、...

影密卫 1万+

Android功耗系列专题分析之四:待机概率性功耗高的失效分析

本文分析了Android设备待机功耗异常高的问题。通过日志发现系统休眠失败,原因是PowerManagerService.Display唤醒锁未被释放。进一步排查发现,指纹解锁功能在灭屏时未正确释放屏幕锁定,导致DisplayReady状态异常。解决方案是将指纹功能的背光控制与DisplayReady状态控制分离,使用两个变量独立管理。经验表明,快速定位问题比解决问题更重要,修改原生流程时需谨慎评估风险。

451

【大模型工程局】告别单打独斗:手把手带你构建多智能体系统(MetaGPT 启示录)

想象一下,不再是只有一个全知全能的 AI,而是有一群各有所长、能够独立思考和行动的“智能体”(Agent)。它们生活在一个共同的环境中,可以相互交流、协作完成共同目标,也可能为了有限资源而相互竞争。这就是多智能体系统(MAS)的核心图景。MAS 的关键特征:自治性 (Autonomy):每个智能体都能独立感知环境、做出决策并执行动作,无需外部直接控制。交互性 (Interaction):智能体之间可以通过某种通信机制(显式或隐式)交换信息、协调行为。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1184

MYSQL:更换主键需要注意的事项

最近在使用主键时,有部分疑惑,所以特意查了一下资料,去了解这些内容。

учёба 1113

小梅哥Xilinx FPGA学习笔记11——亚稳态

亚稳态就是D触发器输入信号在其数据窗口期内发生变化,导致D触发器的输出进入一段时间的不稳定状态,有可能发生振荡,并最终随机稳定在高电平或者低电平。

m0_51430584的博客 631

Mysql数据库引擎MYISAM和INNODB详解

一、数据库引擎   数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。 二、数据库引擎任务   在数据库引擎文档中,各主题的顺序遵循用...

m493096871的博客 1022

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【总结】InnoDB存储引擎

该文章为知识总结的文章,如果是初学者,建议先从专栏学习:数据库专栏 文章目录一、InnoDB存储引擎工作方式二、关键特性1. 插入缓存2. 两次写3. 自适应哈希索引三、redo log、binlog和undo log1. 什么是redo log?2. 什么是binlog?3. redo log和binlog区别4. 回滚日志(undo log)5. redo log和undo log的区别6. 一条更新语句执行的顺序 一、InnoDB存储引擎工作方式 将数据库文件按页(每页16k)读取到缓冲池,然后.

xzzz2020的博客 291

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

为什么 MySQL 需要“回表”?

使用MySQL的你一定听过“回表”。其对查询性能的影响成为普遍共识,但事实果真如此吗?网络上关于“回表”的分析与解决的文章非常多,绝大多数并未指明真正原因,只要使用MySQL就会有“回表”问题吗?

HAibiiin的博客 2257

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

mysql主键一定要有序吗_MySQL为什么需要主键

MySQL为什么需要主键主键表中每一行都应该有可以唯一标识自己的一列(或一组列)。一个顾客可以使用顾客编号列,而订单可以使用订单ID,雇员可以使用雇员ID或雇员社会保险号。主键一列(或一组列),其值能够唯一区分表中的每个行。唯一标识表中每行的这个列(或这组列)称为主键。没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只设计相关的行。表中的任何列都可以作为主键,只要它满足以下条件:任何两...

weixin_42571280的博客 1593

InnoDB 存储引擎

学习Mysql有一段时间了,对SQL语法、索引、查询优化做了一定的了解,但是总感觉浮于表面,所以想换一种角度去理解Mysql-它的存储实现引擎:InnoDB。InnoDB是Mysql5.5之后默认的存储引擎,本文也主要是参照Mysql5.6的官方手册。 一、存储引擎的作用是什么? 在深入讨论InnoDB前,想先讨论以下存储引擎的作用。数据库是我们用来组织和存储数据的工具,在Mysql系统的三层结构中,数据的组织和存储主要由存储引擎层实现。我们知道,Mysql的数据是存在磁盘中,数据的计算是在内存中,所以

weixin_41400063的博客 410

mysql update 事物锁表_详解mysql 锁表 for update (引擎/事务)

转自http://www.jbxue.com/db/13128.html由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住)。例子:假设有个表单products ,里面有id跟name二个栏位,id是主键。例1: (明确指定主键,并且有此笔...

weixin_35757191的博客 561

详解mysql 锁表 for update (引擎/事务)

转自http://www.jbxue.com/db/13128.html 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表...

choukuad381324的博客 378

mysql 事务 myisam_Mysql事务以及InnoDB和MyISAM区别讲解

而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。MYSQL存储数据时,有不同的存储方式,这些方式都使用了不同的底层实现(如:存储机制,索引技巧,索引技巧,锁定水平),底层实现的差异带来的功能也就不同。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。我为什么要改默认引擎,其实原因很简单,我使用的Mysql默认引擎是MyISAM,而MyISAM并不支持事务处理,所以我需要更换它的引擎。

2401_84148518的博客 882

数据库引擎

一:数据库引擎的定义 数据库引擎简单来说就是一个"数据库发动机"。当你访问数据库时,不管是手工访问,还是程序访问,都不是直接读写数据库文件,而是 通过数据库引擎去访问数据库文件。以关系型数据库为例,你发SQL语句给数据库引擎, 数据库引擎解释SQL语句,提取出你需要的数据返回给你。因此,对访问者来说,数据库引擎就是SQL语句的解释器。   正式来说,数据库引擎是用于 存储、处理和保护...

dctCheng的博客 2760

mysql 主键id设置自增唯一 为什么还会重复出现

mysql 主键id设置自增唯一 为什么还会重复出现

happy10091812的博客 3992

mysql 锁表 for update_Mysql 锁表 for update (引擎/事务)

Mysql 锁表 for update (引擎/事务)因为之前用过oracle,知道利用select * for update 可以锁表。所以很自然就想到在mysql中能不能适应for update来锁表呢。学习参考如下由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table L...

weixin_39605004的博客 289

【Mysql】数据库引擎

引擎存储引擎数据库引擎数据库引擎的定义数据库引擎的任务mySql引擎的类别ISAM引擎MyISAM引擎Heap引擎InnoDB引擎InnoDB与MyISAM对比 存储引擎 MySQL常见的两种存储引擎:MyISAM和InnoDB 数据库引擎 数据库引擎的定义 访问数据库时,通过数据库引擎访问数据库文件。以关系数据库为例,发送SQL语句给数据库引擎,数据库引擎解释SQL语句,提取出需要的数据进行返回,数据库引擎就是SQL语句的解释器。 数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可以控制访问

张茂祯的博客 270

MySQL存储引擎选型指南:InnoDB、MyISAM与Memory场景对比

数据库查询性能优化是后端工程师绕不开的命题,而存储引擎的选型往往成为影响系统吞吐的关键一环。在MySQL体系下,InnoDB通过聚簇索引与行级锁支撑高并发事务场景,MyISAM则依靠朴素的结构在只读报表中展现速度优势,Memory引擎以内存存取提供毫秒级响应却需要严格容量控制。理解不同引擎在数据组织、锁竞争与缓存机制上的底层差异,才能精准定位慢查询根因,避免因表锁等待或索引缺失导致性能雪崩。从OLTP高并发到历史归档,只有依据实际读写特征反推引擎选择,并配合规范的切换流程,才能让数据库在正确的位置发挥最大效

weixin_30522983的博客 288
上一篇: Mysql的ut_delay问题分析
下一篇: 高并发场景下优化spinlock
DBAIOps社区
博客等级 码龄3年 970粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值