Mysql5.6-8.0在线DDL操作是否锁表介绍

本文详细比较了MySQL5.6、5.7和8.0中在线DDL操作的差异,包括索引、主键和列的增删改,强调了INPLACE和INSTANT模式以及并发DML的影响。特别指出5.6中扩展VARCHAR列会锁表,而8.0有更灵活的支持。
摘要由CSDN通过智能技术生成

目录

前言

名词介绍

INPLACE       

在线 DDL要求

一、mysql5.6

5.6在线 索引DDL

5.6在线 主键DDL 

5.6在线 列DDL

二、mysql5.7

5.7在线 索引DDL

5.7在线 主键DDL 

5.7在线 列DDL

三、mysql8.0

8.0在线 索引DDL

8.0在线 主键DDL 

8.0在线 列DDL


前言

        常见的在线DDL语句有列操作、主键操作、索引操作、表空间的操作,我们在使用mysql过程中经常会遇到ddl操作,本文针对各种类型的ddl进行分析,列出不会影响查询写入还能在线操作DDL语句

          在mysql5.6 、5.7、8.0中同一种操作语句在不同版本中对表的影响也不一样,简单的例子如在mysql5.6中增加字段长度会锁表,但是在5.7中却不会锁表,本文针对不同mysql版本,罗列了DDL操作对表的影响

名词介绍

INSTANT和INPLACE是MySQL在线DDL操作两种模式,在8.0.12之前,默认是INPLACE,MySQL 8.0.12后默认是INSTANT

INPLACE       

        该模式需要重建表,然后将数据从旧表复制到新表中。这意味着在执行结构变更操作期间,对表的访问可能会被中断。尽管如此,INPLACE模式仍然是一个非常有用的特性,因为它可以在不破坏数据的情况下快速修改表结构。

一般来说:仅修改元数据不会造成锁表和允许并发DML不会造成锁表,但是如果仅允许并发DML的DDL操作,在大批量数据下会有性能损耗

在线 DDL要求

  • 在线 DDL 操作完成之前,它必须等待在表上持有元数据锁的事务提交或回滚。在线 DDL 操作在其执行阶段可能会短暂地需要表上的独占元数据锁,并且在更新表定义时,在操作的最后阶段始终需要一个独占元数据锁。因此,持有表元数据锁的事务可能会导致联机 DDL 操作阻塞。

  • 不支持 MySQL 5.6 之前创建的 包含临时列(DATEDATETIME or TIMESTAMP )且尚未使用重建的表。在这种情况下, 操作会返回以下错误:ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

注意:操作大表且需要重建表的DDL语句建议使用三方工具处理,例如pt-online

        

一、mysql5.6

5.6在线 索引DDL
操作In Place重建表允许并发 DML仅修改元数据
创建或添加二级索引是的
删除索引是的是的
添加FULLTEXT索引是*否*
更改索引类型是的是的
5.6在线 主键DDL 
操作In Place重建表允许并发 DML仅修改元数据
添加主键是的*是的
删除主键
删除一个主键并添加另一个是的是的
5.6在线 列DDL

注意:在5.6中扩展VARCHAR列大小是会锁表的

操作Instant重建表允许并发 DML仅修改元数据
添加列是的*
删除一列是的*是的是的
重命名列是的*是的*是的
对列重新排序是的是的
设置列默认值是的是的是的
更改列数据类型是的
删除列默认值是的是的是的
更改自动增量值是的不*
列设置NULL是的*是的
列设置NOT NULL是的*是的
修改或设置列的注释是的是的是的

二、mysql5.7

5.7在线 索引DDL
操作InstantIn Place允许并发 DML仅修改元数据
创建或添加二级索引是的是的
删除索引是的是的是的
重命名索引是的是的是的
添加FULLTEXT索引是的*不*
添加SPATIAL索引是的
更改索引类型是的是的是的
5.7在线 主键DDL 
操作InstantIn Place允许并发 DML仅修改元数据
添加主键是的*是的*是的
删除主键是的
删除一个主键并添加另一个是的是的是的
5.7在线 列DDL
操作InstantIn Place允许并发 DML仅修改元数据
添加列是的是的是的*
删除一列是的是的是的
重命名列是的是的*是的
对列重新排序是的是的是的
设置列默认值是的是的是的
更改列数据类型是的
扩展VARCHAR列大小是的是的是的
删除列默认值是的是的是的
更改自动增量值是的是的不*
列设置NULL是的是的*是的
列设置NOT NULL是的*是的*是的
修改或设置列的注释是的是的是的

三、mysql8.0

8.0在线 索引DDL
操作InstantIn Place重建表允许并发 DML仅修改元数据
创建或添加二级索引是的是的
删除索引是的是的是的
重命名索引是的是的是的
添加FULLTEXT索引是的*不*
添加SPATIAL索引是的
更改索引类型是的是的是的是的
8.0在线 主键DDL 
操作InstantIn Place重建表允许并发 DML仅修改元数据
添加主键是的*是的*是的
删除主键是的
删除一个主键并添加另一个是的是的是的
8.0在线 列DDL
操作InstantIn Place重建表允许并发 DML仅修改元数据
添加列是的*是的不*是的*是的
删除一列是的*是的是的是的是的
重命名列是的*是的是的*是的
对列重新排序是的是的是的
设置列默认值是的是的是的是的
更改列数据类型是的
扩展VARCHAR列大小是的是的是的
删除列默认值是的是的是的是的
更改自动增量值是的是的不*
列设置NULL是的是的*是的

列设置NOT NULL

是的*是的*是的
修改或设置列的注释是的是的是的是的
MySQL是一种开源的关系型数据库管理系统,它支持多种操作系统,并且广泛应用于Web应用程序的后端数据存储。MySQLDDL(Data Definition Language)是用于定义和管理数据库结构的基础操作。 以下是MySQLDDL的基础操作: 1. 创建数据库:使用CREATE DATABASE语句可以创建一个新的数据库。例如,CREATE DATABASE mydatabase; 2. 删除数据库:使用DROP DATABASE语句可以删除一个已存在的数据库。例如,DROP DATABASE mydatabase; 3. 创建表:使用CREATE TABLE语句可以创建一个新的数据表。在CREATE TABLE语句中,需要指定表名和表的列及其属性。例如,CREATE TABLE mytable (id INT, name VARCHAR(50)); 4. 删除表:使用DROP TABLE语句可以删除一个已存在的数据表。例如,DROP TABLE mytable; 5. 修改表结构:使用ALTER TABLE语句可以修改已存在的数据表的结构,包括添加、修改和删除列等操作。例如,ALTER TABLE mytable ADD COLUMN age INT; 6. 添加主键:使用ALTER TABLE语句可以为数据表添加主键约束,以确保每行数据的唯一性。例如,ALTER TABLE mytable ADD PRIMARY KEY (id); 7. 添加外键:使用ALTER TABLE语句可以为数据表添加外键约束,以确保与其他表的关联完整性。例如,ALTER TABLE mytable ADD FOREIGN KEY (customer_id) REFERENCES customers(id); 8. 创建索引:使用CREATE INDEX语句可以为数据表创建索引,以提高查询性能。例如,CREATE INDEX idx_name ON mytable (name); 这些是MySQLDDL的基础操作,通过这些操作可以定义和管理数据库的结构。如果你有更具体的问题或者需要了解更多高级的DDL操作,请告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海盗巨人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值