我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL数据库中DDL语句的介绍和使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL数据库中DDL语句的介绍和使用

这篇文章的知识点包括:DDL语句的简介、DDL语句的操作以及DDL语句的使用注意事项,阅读完整文相信大家对MySQL数据库中DDL语句有了一定的认识。

1.Online DDL简介

在MySQL的早期版本中,DDL操作因为锁表会和DML操作发生锁冲突,大大降低并发性。在早期版本中,大部分DDL操作的执行原理就是通过重建表的方式,因为要复制原表数据,所以会长时间锁表,只能读不能写,DDL操作和DML操作有很严重的冲突。从MySQL5.6开始,很多DDL操作过程都进行了改进,出现了Online DDL,用于支持DDL执行期间DML语句的并行操作,提高数据库的吞吐量。

MySQL 在线DDL分为 INPLACECOPY 两种方式,通过在ALTER语句的ALGORITHM参数指定。

  • ALGORITHM=INPLACE,可以避免重建表带来的IO和CPU消耗,保证ddl期间依然有良好的性能和并发。
  • ALGORITHM=COPY,需要拷贝原始表,所以不允许并发DML写操作,可读。这种copy方式的效率还是不如 inplace ,因为前者需要记录undo和redo log,而且因为临时占用buffer pool引起短时间内性能受影响。

上面只是 Online DDL 内部的实现方式,此外还有 LOCK 选项控制是否锁表,根据不同的DDL操作类型有不同的表现:默认MySQL尽可能不去锁表,但是像修改主键这样的昂贵操作不得不选择锁表。

  • LOCK=NONE,即DDL期间允许并发读写涉及的表,比如为了保证 ALTER TABLE 时不影响用户注册或支付,可以明确指定,好处是如果不幸该 alter语句不支持对该表的继续写入,则会提示失败,而不会直接发到库上执行。
  • LOCK=SHARED,即DDL期间表上的写操作会被阻塞,但不影响读取。
  • LOCK=DEFAULT,让mysql自己去判断lock的模式,原则是mysql尽可能不去锁表
  • LOCK=EXCLUSIVE,即DDL期间该表不可用,堵塞任何读写请求。如果你想alter操作在最短的时间内完成,或者表短时间内不可用能接受,可以手动指定。

但是有一点需要说明,无论任何模式下,Online DDL开始之前都需要一个短时间排它锁(exclusive)来准备环境,所以alter命令发出后,会首先等待该表上的其它操作完成,在alter命令之后的请求会出现等待waiting meta data lock。同样在DDL结束之前,也要等待alter期间所有的事务完成,也会堵塞一小段时间。所以尽量在ALTER TABLE之前确保没有大事务在执行,否则一样出现连环锁表。

2.不同类DDL操作详情

不同种类DDL语句具体的执行情况是不同的,下表列举出常见DDL语句具体的执行详情,包括是否允许读写及是否锁表。这个表格希望大家可以详细对比看下,特别要关注下需要copy table的DDL操作。

操作支持方式Allow R/W说明
add/create indexonline允许读写当表上有FULLTEXT索引除外,需要锁表,阻塞写
drop indexonline允许读写操作元数据,不涉及表数据。所以很快,可以放心操作
optimize tableonline允许读写当带有fulltext index的表用copy table方式并且阻塞写
alter table...engine=innodbonline允许读写当带有fulltext index的表用copy table方式并且阻塞写
add columnonline允许读写(增加自增列除外)1、添加auto_increment列要锁表,阻塞写;2、虽采用online方式,但是表数据需要重新组织,所以增加列依然是昂贵的操作
drop columnonline允许读写(增加自增列除外)同add column,重新组织表数据,,昂贵的操作
Rename a columnonline允许读写操作元数据;不能改列的类型,否则就锁表
Reorder columnsonline允许读写重新组织表数据,昂贵的操作
Make column NOT NULLonline允许读写重新组织表数据,昂贵的操作
Change data type of column copy table仅支持读,阻塞写 创建临时表,复制表数据,昂贵的操作
Set default value for a columnonline允许读写操作元数据,因为default value存储在frm文件中,不涉及表数据。所以很快,可以放心操作
alter table xxx auto_increment=xx online允许读写操作元数据,不涉及表数据。所以很快,可以放心操作 
Add primary keyonline允许读写昂贵的操作
Convert character set copy table仅支持读,阻塞写如果新字符集不同,需要重建表,昂贵的操作
3.DDL最佳实践

虽然MySQL 5.6和5.7版本提供了Online DDL操作,但Online DDL仍存在以下问题:

  • 主从复制延迟,只有主库上DDL执行成功才会写入到binlog中,而DDL操作在从库上不能并发执行,因此即使主库执行DDL时允许并发DML操作,对于大表操作,仍会引发严重的复制延迟。
  • 主库执行Online DDL时,不能根据负载暂停DDL操作。
  • 使用Inplace方式执行的DDL,发生错误或被KILL时,需要一定时间的回滚期,执行时间越长,回滚时间越长。
  • 使用Copy方式执行的DDL,需要记录过程中的undo和redo日志,同时会消耗buffer pool的资源,效率较低,优点是可以快速停止。
  • Online DDL并不是所有时间段的Online,在特定时间段需要加元数据锁或其他锁。
  • 允许并发DML的DDL,可能会导致Duplicate entry问题。

针对DDL,下面整理下几点干货建议,之后执行DDL语句时可以参考下:

  1. 执行DDL前查看下该表有没有被事务占用,防止出现MDL锁。
  2. 执行DDL前确保datadir,tmpdir磁盘空间足够。
  3. 能业务低峰期操作的DDL,都尽量安排在业务低峰期进行。
  4. 对于大表和较大表,如果对复制延迟和主库性能敏感,建议改为gh-ost或pt-osc工具。
  5. 对于并发操作较高的表,无论表数据量多少,不能在业务高峰期操作。
  6. 同个表的多个DDL语句可以合并在一起进行,避免多次table rebuild带来的消耗。但是也要注意分组,比如需要copy table和只需inplace就能完成的,应该分两个alter语句。

以上就是MySQL数据库中DDL语句的介绍和使用,看完之后是否有所收获呢?如果想了解更多相关内容,欢迎关注亿速云行业资讯!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL数据库中DDL语句的介绍和使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

oracle数据库ddl语句怎么使用

在Oracle数据库中,DDL(Data Definition Language)语句用于定义数据库对象,如表、视图、索引等。以下是一些常见的DDL语句及其用法:创建表:CREATE TABLE table_name (column1 da
oracle数据库ddl语句怎么使用
2024-04-09

SQL语句中的DDL类型的数据库定义语言操作

目录SQL语句之DDL类型的数据库定义语言1.DDL类型的SQL语句基本概述2.DDL类型的SQL语句之数据库层面的操作2.1.创建一个数据库2.2.查看mysql中有哪些数据库2.3.进入某个数据库2.4.查看当前处于哪个数据库中3.DD
2022-08-09

常见数据库介绍和使用场景

在构建系统时要进行设计考虑和权衡。1.介绍要选择正确的存储解决方案,需要以下考虑。关键因素数据结构查询模式您需要处理的数量或规模2.缓存解决方案如果您经常调用数据库或远程调用具有高延迟的独立服务,则可能需要[缓存](https://interviewdaemo
常见数据库介绍和使用场景
2018-03-25

MySQL中使用备库作逻辑备份,如何处理主库的DDL语句

## 确保可重复读隔离级别S1: set session transaction isolation level repeatable read;## 确保能得到一个一致性视图S2: start transaction with consistent snap
MySQL中使用备库作逻辑备份,如何处理主库的DDL语句
2021-04-01

mysql中删除数据库的语句

删除 mysql 数据库使用 drop database database_name; 语句,其中 database_name 为要删除的数据库名称。注意事项:备份数据,只有拥有 drop 权限的用户可以删除数据库,删除前删除数据库中的所有
mysql中删除数据库的语句
2024-04-26

如何使用SQL语句在MySQL中创建和管理数据库?

如何使用SQL语句在MySQL中创建和管理数据库?MySQL是一种广泛应用的关系型数据库管理系统,提供了丰富的SQL语句来创建和管理数据库。在本文中,我们将详细介绍如何使用SQL语句在MySQL中创建和管理数据库,并提供具体的代码示例。一、
如何使用SQL语句在MySQL中创建和管理数据库?
2023-12-17

编程热搜

目录