广告
返回顶部
首页 > 资讯 > 数据库 >MySQL DDL详情揭露
  • 746
分享到

MySQL DDL详情揭露

2024-04-02 19:04:59 746人浏览 八月长安
摘要

前言:  Mysql中DDL语句,即数据定义语言,用于创建、删除、修改、库或表结构,对数据库或表的结构操作。常见的有create,alter,drop等。这类语句通常会耗费很大代价,特别是对于大表做表结构变

前言: 

Mysql中DDL语句,即数据定义语言,用于创建、删除、修改、库或表结构,对数据库或表的结构操作。常见的有create,alter,drop等。这类语句通常会耗费很大代价,特别是对于大表做表结构变更。本篇文章会揭露各类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 index online 允许读写 当表上有FULLTEXT索引除外,需要锁表,阻塞写
drop index online 允许读写 操作元数据,不涉及表数据。所以很快,可以放心操作
optimize table online 允许读写 当带有fulltext index的表用copy table方式并且阻塞写
alter table...engine=innodb online 允许读写 当带有fulltext index的表用copy table方式并且阻塞写
add column online 允许读写(增加自增列除外) 1、添加auto_increment列要锁表,阻塞写;2、虽采用online方式,但是表数据需要重新组织,所以增加列依然是昂贵的操作
drop column online 允许读写(增加自增列除外) 同add column,重新组织表数据,,昂贵的操作
Rename a column online 允许读写 操作元数据;不能改列的类型,否则就锁表
Reorder columns online 允许读写 重新组织表数据,昂贵的操作
Make column NOT NULL online 允许读写 重新组织表数据,昂贵的操作
Change data type of column  copy table 仅支持读,阻塞写  创建临时表,复制表数据,昂贵的操作
Set default value for a column online 允许读写 操作元数据,因为default value存储在frm文件中,不涉及表数据。所以很快,可以放心操作
alter table xxx auto_increment=xx  online 允许读写 操作元数据,不涉及表数据。所以很快,可以放心操作 
Add primary key online 允许读写 昂贵的操作
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语句。

参考: 

  • https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html
  • Https://www.cnblogs.com/rayment/p/7762520.html
您可能感兴趣的文档:

--结束END--

本文标题: MySQL DDL详情揭露

本文链接: https://www.lsjlt.com/news/47524.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • MySQL DDL详情揭露
    前言:  MySQL中DDL语句,即数据定义语言,用于创建、删除、修改、库或表结构,对数据库或表的结构操作。常见的有create,alter,drop等。这类语句通常会耗费很大代价,特别是对于大表做表结构变...
    99+
    2022-10-18
  • MySQL DDL锁表情况分析
    这篇文章主要介绍“MySQL DDL锁表情况分析”,在日常操作中,相信很多人在MySQL DDL锁表情况分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL DDL锁...
    99+
    2022-10-18
  • 【MySQL】Online DDL详解
    目录 前言一、分类二、Copy三、Inplace四、Instant五、一些补充六、总结 前言 一天,一位许久未见的澳同学,一见面先不是打招呼,直接给我当面一问 澳同学问我:小涛小涛,我这一...
    99+
    2023-08-31
    mysql 数据库 database
  • MySQL DDL执行方式Online DDL详解
    目录1 引言2 概述3 介绍4 用法5 两种算法第一种 Copy第二种 Inplace6 执行过程7 踩坑8 限制9 总结1 引言 一般来说mysql分为DDL(定义)和DML(操作)。 DDL:Data Definit...
    99+
    2022-09-22
  • MySQL DDL执行方式Online DDL详解
    目录1 引言2 概述3 介绍4 用法5 两种算法第一种 Copy第二种 Inplace6 执行过程7 踩坑8 限制9 总结1 引言 一般来说MySQL分为DDL(定义)和DML(操作...
    99+
    2022-11-13
  • Mysql Online DDL的使用详解
    目录正文LOCK参数ALGORITHM参数COPY TABLE流程IN-PLACE流程允许并发DML的DDL操作不允许并发DML的DDL操作正文 Online DDL在MySQL 5.6才开始支持的,在5.5及之前...
    99+
    2022-05-22
    Mysql Online DDL Mysql Online DDL的使用
  • MySql Online DDL操作记录详解
    目录一、环境二、执行过程分析三、遇到的问题四、工具尝试五、Online DDL 尝试一、环境 为支持用户账号删除功能,需要在 user 表上加一个字段 deleted。 数据库:mysql5.6 被 操作表 ...
    99+
    2022-12-20
    MySqlOnlineDDL操作 MySqlOnlineDDL
  • MySQL & MariaDB Online DDL的详解示例
    这篇文章主要介绍MySQL & MariaDB Online DDL的详解示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL教程栏目介绍指导MySQL & ...
    99+
    2022-10-18
  • MySQL行转列详情
    目录一、行转列SQL写法二、如果领导@你,让你在结果集中加上总数列呢?三、领导又双叒叕@你改需求四、结束语附录:创建表结构&测试数据SQL  MySQL行...
    99+
    2022-11-12
  • MySQL 8.0的原子DDL非事务性DDL,绝大多数情况下,原子DDL仍旧是一个然并卵的特性
    首先声明一下:MySQL 8.0之后,依旧不支持DDL事务。原子性DDL与其说是一个MySQL8.0下的新特性,倒是不如说是修复了MySQL5.7 DDL 执行失败造成的bug。 MySQL 8.0 前后表的物理文件差异在mysq...
    99+
    2018-02-20
    MySQL 8.0的原子DDL非事务性DDL,绝大多数情况下,原子DDL仍旧是一个然并卵的特性
  • Android如何使用圆形揭露动画巧妙地隐藏或显示View详解
    目录1.引言2.圆形揭露动画简介3.使用圆形揭露动画隐藏或显示View3.1 简易布局3.2 使用圆形揭露动画隐藏View3.3 使用圆形揭露动画显示View4.总结1.引言 在开发...
    99+
    2022-11-13
  • MySQL 数据类型详情
    目录1、数值类型1.1、数值类型分类1.1.1、浮点数1.1.2、位类型1.1.3、时间日期类型1.1.4、字符串类型1.1.5、ENUM 类型1.1.6、SET类型1、数值类型 1...
    99+
    2022-11-12
  • MySQL分库分表详情
    一、业务场景介绍 假设目前有一个电商系统使用的是MySQL,要设计大数据量存储、高并发、高性能可扩展的方案,数据库中有用户表。用户会非常多,并且要实现高扩展性,你会怎么去设计? OK...
    99+
    2022-11-12
  • mysql 计算函数详情
    目录2、字段拼接2、举一些mysql 函数例子2.1 符处理2.2 期处理2.3 值处理函数没有SQL的可移植性强 能运行在多个系统上的代码称为可移植的(portable)。相对来说...
    99+
    2022-11-12
  • mysql 安全管理详情
    目录1、就按单介绍2、创建用户3、删除用户账号4、访问权限5、更改口令1、就按单介绍 MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少。 换句...
    99+
    2022-11-12
  • MySQL总结(三)DDL数据定义语言-详解
    每行语句需要选中后再执行,可以选中后按F9快捷键执行 1.1.2 具体操作 -- 直接创建数据库db1; create database db1; -- 判断数据库是否存在,如果不存在则创建数据库db2; create database...
    99+
    2021-10-12
    MySQL总结(三)DDL数据定义语言-详解
  • Mysql排序的特性详情
    目录1、问题场景2、原因分析3、解决方案4、拓展知识4.1 limit查询优化4.2 limit与order by结合使用5、小结1、问题场景 新上线一个交易记录导出功能,逻辑很简单...
    99+
    2022-11-12
  • MySQL的 DDL和DML和DQL的基本语法详解
    目录一、DDL(数据定义语言)二、DML(数据操作语言)三、DQL(数据查询语言)四、聚合函数前言             &nb...
    99+
    2022-07-25
    MySQL的 DDL和DML和DQL MySQL的 DDL和DML和DQL语法
  • MySQL教程数据定义语言DDL示例详解
    目录1.SQL语言的基本功能介绍2.数据定义语言的用途3.数据库的创建和销毁4.数据库表的操作(所有演示都以student表为例)1)创建表2)修改表3)销毁表如果你是刚刚学习MyS...
    99+
    2022-11-12
  • MySQL的 DDL和DML和DQL的基本语法详解
    目录一、DDL(数据定义语言)二、DML(数据操作语言)三、DQL(数据查询语言)四、聚合函数前言          &n...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作