MySQL-5.7 innodb在线DDL操作(增删改索引、列、外键、表、外键)

news2024/12/23 18:44:09

基本概念

在开始阅读前,先熟悉下以下概念,以便更加方便理解。

DML
DML(Data Manipulation Language)数据操作语言-数据库的基本操作,SQL中处理数据等操作统称为数据操纵语言,简而言之就是实现了基本的“增删改查”操作。包括的关键字有:select、update、delete、insert、merge

DDL
DDL(Data Definition Language)数据定义语言-用于定义和管理 SQL 数据库中的所有对象的语言,对数据库中的某些对象(例如,database,table)进行管理。包括的关键字有:create、alter、drop、truncate、comment、grant、revoke

SQL_MODE
为当前会话设置严格模式:
执行SET sql_mode = ‘STRICT_TRANS_TABLES’ 或者SET sql_mode = ‘STRICT_ALL_TABLES’
全局设置严格模式:
执行SET global sql_mode = ‘STRICT_TRANS_TABLES’ 或者SET global sql_mode = ‘STRICT_ALL_TABLES’

INPLACE/COPY算法
在执行DDL时复制表数据,INPLACE表示不会复制表数据,COPY表示会复制表数据

重建表(Rebuild Table)
在执行DDL的时是否需要重建表,例如对于InnoDB,因为其是基于主键(聚集索引)组织数据的,所以如果修改主键(如增加一列),则会需要重建表。

允许并发DML
在执行DDL时是否允许并发的DML。例如,在增加一个二级索引时,允许对数据库执行DML等操作。

只修改元数据
在执行DDL时是否只修改表的元数据,而不需要修改数据。例如,对于修改表名,只需要修改该表的元数据,而不需要触及该表的数据。

索引操作

下表概述了对索引操作的在线 DDL 支持。星号表示附加信息、异常或依赖关系。

索引操作的在线 DDL 支持:

操作IN PLACE 算法重建表(Rebuild Table)允许并发DML只修改元数据说明
创建或添加二级索引YesNoYesNo创建的二级索引包含在创建index结束之前提交的数据,不包含未提交的数据,旧版本的数据,被标记为删除但未从旧索引删除的数据。
删除索引YesNoYesYes只有在所有访问该表的事务都结束后才会结束删除索引,即索引的初始状态是表的最近状态。
重命名索引YesNoYesYes只修改元数据而不触及数据
添加FULLTEXT索引Yes*No*NoNo如果没有用户定义的FTS_DOC_ID列,则需要重建表;其他的不需要重建表。
添加SPATIAL索引YesNoNoNo与FULLTEXT相同。
更改索引类型YesNoYesYes修改索引类型,USING BTREE 或者HASH,与重建索引类似

如果服务器在创建二级索引时退出,则在恢复时,MySQL 会删除任何部分创建的索引。您必须重新运行ALTER TABLE orCREATE INDEX语句。

主键操作

索引操作的在线 DDL 支持:

操作IN PLACE 算法重建表(Rebuild Table)允许并发DML只修改元数据说明
添加主键索引Yes*Yes*YesNo新增主键,需要重建数据表(根据聚集索引重排)。 如果有列必须要从NULL转成NOT NULL,那么不允许INPLACE算法。
删除主键索引NoYesNoNo在删除主键而不增加新主键时,只有COPY方式才能被使用
删除并且增加另一个主键索引YesYesYesNo需要重建表,所以此操作的代价非常大。

新增主键: 当新建UNIQUE和PK时,MySQL需要做重复值检查,对于PK,还需要检查不包含NULL值。使用COPY方式时,MySQL会将NULL转为对应的默认值(数字为 0,基于字符的列和 BLOB 为空字符串,0000-00-00 00:00:00 为DATETIME)。为了支持INPLACE,需要设置SQL_MODE(strict_trans_tables或strict_all_tables)。

新建主键的过程如下:从数据从原表t中复制到新的临时表t1(新的主键/聚集索引)中,然后将原表重命名到一个临时表的名字t2,然后将新索引的临时表t1重命名为原表名t,最后将旧表t2删除。

当采用INPLACE时,即使数据仍然需要复制,但性能仍然会比COPY方式要好:

  1. INPLACE不需要UNDO/REDO log;
  2. 二级索引是预排序的,能够有序地读取;
  3. 不需要更改缓冲区,因为没有二级索引的随机插入;

列操作

下表概述了对列操作的在线 DDL 支持。星号表示附加信息、异常或依赖关系。

操作IN PLACE 算法重建表(Rebuild Table)允许并发DML只修改元数据说明
添加列YesYesYes*No添加列时不允许并发 DML 。需要重建表,所以此操作的代价非常大。所以增加列时可以增加 ALGORITHM=INPLACE, LOCK=SHARED。
删除列YesYesYesNo需要重建表,所以此操作的代价非常大。
重命名列YesNoYes*Yes如果需要允许并发 DML,需要保持相同的数据类型和[NOT] NULL属性,只改变列名。如果重命名属于外键约束的列,外键定义会自动更新以使用新的列名。重命名参与外键的列仅适用于 ALGORITHM=INPLACE. 如果您使用该 ALGORITHM=COPY子句,或者某些其他条件导致操作使用 ALGORITHM=COPY,则该ALTER TABLE语句将失败。
重新排序列YesYesYesNo需要重建表,所以此操作的代价非常大。
设置列默认值YesNoYesYes仅修改表元数据。默认列值存储在表的.frm 文件 中,而不是InnoDB 数据字典中。
更改列数据类型NoYesNoNo仅支持更改列数据类型 ALGORITHM=COPY。
扩展VARCHAR列大小YesNoYesYes
删除列默认值YesNoYesYes仅修改表元数据。默认列值存储在表的.frm 文件 中,而不是InnoDB 数据字典中。
更改自动增量值YesNoYesNo*修改存储在内存中的值,而不是数据文件。
修改列为NULLYesYes*YesNo需要重建表,所以此操作的代价非常大。
修改列为NOT NULLYes*Yes*YesNo需要重建表,所以此操作的代价非常大。
修改定义为enum或者set列YesNoYesYes

重新排序列

如果需要重新排序列,使用FIRST或者 AFTER in CHANGE或者 MODIFY操作。

ALTER TABLE tbl_name MODIFY COLUMN col_name column_definition FIRST, ALGORITHM=INPLACE, LOCK=NONE;

扩展VARCHAR列大小

扩展VARCHAR列大小操作是平常最常见的操作了。列的字节长度VARCHAR取决于字符集的字节长度,ascii为一个字节(单字节),utf8为三个字节。

对于VARCHAR大小为 0 到 255 字节的列,需要一个长度字节来对值进行编码。
对于VARCHAR 大小为 256 字节或更多的列,需要两个长度字节。

ALTER TABLE仅支持将 VARCHAR列大小从 0 字节增加到 255 字节,或从 256 字节增加到更大的大小。

ALTER TABLE不支持增加a列的大小 VARCHAR从小于 256 字节到等于或大于 256 字节的列。在这种情况下,所需的长度字节数从 1 变为 2,这情况只能使用ALGORITHM=COPY。例如,尝试VARCHAR使用将单字节字符集(例如ascii)的列大小从 VARCHAR(255) 更改为 VARCHAR(256) ,ALTER TABLE返回错误。如果使用utf8字符集则可以成功修改。

ascii字符集表使用ALGORITHM=INPLACE将varchar(200)修改为varchar(256):

ALTER TABLE employee ALGORITHM=INPLACE, CHANGE COLUMN remark remark VARCHAR(300);
ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

ascii字符集表使用ALGORITHM=COPY将varchar(200)修改为varchar(256):

ALTER TABLE employee ALGORITHM=copy , CHANGE COLUMN remark remark VARCHAR(300)
[2023-01-07 17:09:38] 1 row affected in 88 ms

不支持VARCHAR减小尺寸。ALTER TABLE减小VARCHAR 大小需要使用ALGORITHM=COPY。ascii或者utf8字符集表都不支持使用ALGORITHM=INPLACE。

VARCHAR(300)修改为VARCHAR(288):

ALTER TABLE employee ALGORITHM=INPLACE , CHANGE COLUMN remark remark VARCHAR(288);
ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

ALTER TABLE employee ALGORITHM=copy , CHANGE COLUMN remark remark VARCHAR(288)
[2023-01-07 17:12:36] 1 row affected in 97 ms

STORED操作

STORED列可能比较陌生。

举个例子:
user表有姓(surname)和name(名),创建一个full_name(全名) STORED列

ALTER TABLE user ADD COLUMN (full_name varchar(12) GENERATED ALWAYS AS (concat(surname,name)) STORED), ALGORITHM=COPY;

插入数据查询如下:

insert into user(surname, name) VALUES ('孙','悟空'),('诸葛','亮');
select * from user;

在这里插入图片描述

下表概述了对STORED列操作的在线 DDL 支持。

操作IN PLACE 算法重建表(Rebuild Table)允许并发DML只修改元数据说明
添加STORED列NoYesNoNo需要重建表,所以此操作的代价非常大。
修改STORED列顺序NoYesNoNo需要重建表,所以此操作的代价非常大。
删除STORED列YesYesYesNo需要重建表,所以此操作的代价非常大。
添加VIRTUAL列YesNoYesYes
修改VIRTUAL列顺序NoYesNoNo需要重建表,所以此操作的代价非常大。
删除VIRTUAL列YesNoYesYes

外键操作

下表概述了对外键操作的在线 DDL 支持。星号表示附加信息、异常或依赖关系。

操作IN PLACE 算法重建表(Rebuild Table)允许并发DML只修改元数据说明
添加外键约束Yes*NoYesNo当FOREIGN_KEY_CHECKS被禁用时,可以用INPLACE;否则只能COPY。
删除外键约束YesNoYesYes当FOREIGN_KEY_CHECKS被禁用时,可以用INPLACE;否则只能COPY。

FOREIGN_KEY_CHECKS
FOREIGN_KEY_CHECKS是用来启动和关闭外键约束的方法。
SELECT @@FOREIGN_KEY_CHECKS;查看当前FOREIGN_KEY_CHECKS的值
SET FOREIGN_KEY_CHECKS = 0;关闭外键约束
SET FOREIGN_KEY_CHECKS = 1;启动外键约束

表操作

下表概述了表操作的在线 DDL 支持。星号表示附加信息、异常或依赖关系。

操作IN PLACE 算法重建表(Rebuild Table)允许并发DML只修改元数据说明
改变ROW_FORMATYesYesYesNo需要重建表,所以此操作的代价非常大。
改变KEY_BLOCK_SIZEYesYesYesNo需要重建表,所以此操作的代价非常大。
设置持久表统计信息YesNoYesYes仅修改表元数据。
指定字符集YesYes*NoNo
转换字符集NoYes*NoNo需要重建表,所以此操作的代价非常大。
优化表Yes*YesYesNo
FORCE使用选项重建Yes*YesYesNo
执行空重建Yes*YesYesNo
重命名表YesNoYesYes

改变ROW_FORMAT

ALTER TABLE tbl_name ROW_FORMAT = row_format, ALGORITHM=INPLACE, LOCK=NONE;

需要重建表,所以此操作的代价非常大。

改变KEY_BLOCK_SIZE

ALTER TABLE tbl_name KEY_BLOCK_SIZE = value, ALGORITHM=INPLACE, LOCK=NONE;

需要重建表,所以此操作的代价非常大。

KEY_BLOCK_SIZE
创建innodb表时带上ROW_FORMAT=COMPRESSED参数能够使用比默认的16K更小的页。这样在读写时需要更少的I/O,对于SSD磁盘更有价值。
页的大小通过KEY_BLOCK_SIZE参数指定。

设置持久表统计选项

ALTER TABLE tbl_name STATS_PERSISTENT=0, STATS_SAMPLE_PAGES=20, STATS_AUTO_RECALC=1, ALGORITHM=INPLACE, LOCK=NONE;

STATS_PERSISTENT指定是否为InnoDB表启用持久统计信息。值DEFAULT 由innodb_stats_persistent设置。值1启用表的持久统计信息,而值0禁用该功能。为单个表启用持久统计信息后,请在加载表数据后使用ANALYZE table计算统计信息。

STATS_SAMPLE_PAGES指定在例如通过ANALYZE TABLE操作为索引列计算基数和其他统计信息时要采样的索引页数。

STATS_AUTO_RECALC指定是否自动重新计算持久统计信息。值DEFAULT使表的持久统计设置由innodb_stats_auto_recalc设置确定。如果值为1,则当10%的表数据发生更改时,将重新计算统计信息。值0阻止自动重新计算表。使用值0时,在对表进行实质性更改后,使用ANALYZE TABLE重新计算统计信息。

指定字符集

ALTER TABLE tbl_name CHARACTER SET = charset_name, ALGORITHM=INPLACE, LOCK=NONE;

如果新字符编码不同,则重建表。

转换字符集

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name, ALGORITHM=COPY;

如果新字符编码不同,则重建表。

优化表

OPTIMIZE TABLE tbl_name;

优化表格,使用INPLACE(5.6.17后),但不支持ALGORITHM和LOCK的语法。但是有FULLTEXT索引的表不能够使用INPLACE。

FORCE使用选项 重建表

ALTER TABLE tbl_name FORCE, ALGORITHM=INPLACE, LOCK=NONE;

ALGORITHM=INPLACE从 MySQL 5.6.17 开始 使用。表有FULLTEXT 索引时不支持使用ALGORITHM=INPLACE。

执行“空”重建

ALTER TABLE tbl_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;

从 MySQL 5.6.17 开始使用ALGORITHM=INPLACE。表有FULLTEXT 索引时不支持使用ALGORITHM=INPLACE。

重命名表

ALTER TABLE old_tbl_name RENAME TO new_tbl_name, ALGORITHM=INPLACE, LOCK=NONE;

重命名表,不会执行copy操作。

参考:https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html#online-ddl-primary-key-operations

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

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

相关文章

jenkins中错误总结

每次使用jenkins都会遇到不同的bug,接下来我们看一下这几个 libXrender.so.1: cannot open shared object file: No such file or directory 接下来我们看一下解决方案,一步一步安装好就可以了 yum install ksh -y yum install libXext.so.6 -y yum install libX…

案例分析 - 考查点总览

个人总结,仅供参考,欢迎加好友一起讨论 系分 - 案例分析 - 总览知识点 往年案例一览 一般情况下,往下数5、6年的题目出题形式,具有参考意义 年份试题一试题二试题三试题四试题五2022年系统分析与建模[结构化与面向对象分析、用例…

MySQL (四)------DML操作表记录-增删改【重点】DQL操作表记录-查询【重点】

DML操作表记录-增删改【重点】 准备工作: 创建一张商品表(商品id,商品名称,商品价格,商品数量.) create table product(pid int primary key auto_increment,pname varchar(40),price double,num int ); 1.1 插入记录 1.1.1 语法 方式一: 插入指定列, 如果没有把这个列进行列…

联合证券|2022年逾200家企业IPO“撤单”,谁在“临阵脱逃”?

刚刚过去的2022年,A股IPO募集资达5870亿元,创下前史新高。不过,也有不少“带病闯关”的IPO项目遇阻,计算数据显现,2022年A股IPO共有234家企业撤单,创9年以来最大撤回潮。 谁在惊惶万状? 2022年…

LeetCode[剑指offer 40]最小的k个数

难度:简单 题目: 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 1: 输入:arr [3,2,1], k 2 输出:[…

C 语言的 互斥锁、自旋锁、原子操作

今天不整 GO 语言,我们来分享一下以前写的 C 代码,来看看 互斥锁,自旋锁和原子操作的 demo 互斥锁 临界区资源已经被1个线程占用,另一个线程过来访问临界资源的时候,会被CPU切换线程,不让运行后来的这个线…

基础算法(二)——归并排序

归并排序 介绍 归并排序是一种复杂度O(nlog(n)nlog(n)nlog(n))的排序算法,并且在任何情况下都是,但是它不是原地算法,即需要额外存储空间 其原理是,先将区间均匀分成左右两半,然后再对左右两半继续二分,…

Large Language Models Are Reasoning Teachers

Paper name Large Language Models Are Reasoning Teachers Paper Reading Note URL: https://arxiv.org/pdf/2212.10071.pdf twitter 宣传: https://twitter.com/itsnamgyu/status/1605516353439354880 TL;DR 提出了 Fine-tune-CoT 方法,旨在利用非…

Java --- JVM对象内存布局与访问定位

目录 一、对象内存布局 1.1、对象头(Header) 1.1.1、运行时元数据(Mark Word) 1.1.2、 类型指针 1.2、实例数据(Instance Date) 1.3、对齐填充(Padding) 二、对象访问定位 一、对象内存布局 1.1、对象头(Header) 1.1.1、运行时元数据(Mark Word) 1、哈希值(HashCode) 2、G…

【高级人工智能】国科大《高级人工智能》符号主义笔记

国科大《高级人工智能》罗老师部分——符号主义笔记 罗老师上课很有意思,但是这部分内容还是挺难理解的,需要仔细思考今年考试题目这部分跟往年不一样,老师讲的重点(A搜索归结原理)也没考😅 文章目录几个概…

FFmpeg

介绍 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量&…

Windows 下安装共享文件夹(一步一步带你创建,亲测有效果)

目录1 需求2 实现1 需求 我们想要在自己的Windows电脑上面安装一个共享文件夹,想让其他电脑连我们的共享文件夹,或者我们需要使用代码,连接这个共享文件夹,所以我们必须先在Windows电脑创建一个共享文件夹 2 实现 首先我们创建…

centos7.9安装harbor-offline-installer-v2.4.1.tgz

1.首先下载安装包 可以去github上搜索下载: GitHub: Let’s build from here GitHub 然后选择版本进行下载,一般从githut上下载速度很慢,我已提前下载好,从csdn上下载会比较快: harbor-offline-installer-v2.4.1.tgz: https:…

聊聊跳表?

什么是跳表 跳表(Skip List)是一种类似于链表的数据结构,其查询、插入、删除的时间复杂度都是O(logn)。 在传统的单链表结构中,查找某个元素需要从链表的头部按顺序遍历,直到找到目标元素为止,查找的时间复…

PowerShell木马免杀利器: Invoke-Obfuscation(过火绒)

Invoke-Obfuscation 简介 Invoke-Obfuscation工具下载地址: https://github.com/danielbohannon/Invoke-Obfuscation Invoke-Obfuscation是一款PowerShell混淆工具,可以将PowerShell脚本加密,使得它的检测和分析变得更加困难。该工具包含多种加密方法&…

HTML实现右下角闪烁弹窗

演示 完整HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&…

【系列01】java运算符及运算符优先级[附带目录 按需服用]

运算符、三元运算符、位运算符、拓展赋值、运算优先级、自增自减 运算符 java代码优先级多用括号**,多用括号()**不仅方便而且增加可读性 自增自减 a 是先赋值再增加a 是先增加再赋值上面都表示 a a1;自减同理由 public class Demo05 {public static void main(String[] ar…

CSS3 之属性

文章目录calcborderbox-shadowbackground-image垂直渐变水平渐变左上角渐变渐变方向写法组合background-clipbackground-attachmentword-wrap:break-word&#xff1a;允许长单词换行到下一行;word-wrap:word-break&#xff1a;text-shadow3、字体white-space 设置如何处理元素内…

Java设计模式中建造者模式是啥/建造者模式实现细节是什么/工厂模式,抽象工厂与建造者模式之间区别是啥

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 4.6 建造者模式 4.6.1 概述 分离部件构造(由Builder来创建)和装配(Director组装)实现构建与装配解耦用户只需指定复杂对象类型就可得到最终对象&#xff0c;不需…

医药行业应用APS生产排产软件的必要性

高级计划与排程APS生产排产软件(advanced planning and scheduling) 是一个立足于整个企业生产活动的计算机系统。利用APS生产排产软件的管理手段和信息&#xff0c;企业可优化其从制定生产产量到管理最终产品的整个生产流程中的各个环节。利用实时、准确的数据&#xff0c;APS…