域名

MySQL新增字段/索引会不会锁表?

字号+作者:益华科技来源:人工智能2025-11-05 15:53:42我要评论(0)

MySQL表的结构修改往往伴随着表级锁的问题。特别是对于那些数据量较大的表,这会对业务系统的性能产生显著影响。通过优化表结构修改的操作,开发者可以避免或最小化锁表时间,从而保证系统的正常运行。表级锁介

MySQL表的增字结构修改往往伴随着表级锁的问题。特别是段索对于那些数据量较大的表,这会对业务系统的锁表性能产生显著影响。

通过优化表结构修改的增字操作,开发者可以避免或最小化锁表时间,段索从而保证系统的锁表正常运行。

MySQL新增字段/索引会不会锁表?

表级锁介绍

表级锁指在执行某些操作时,增字为了保证数据的段索一致性,对整个表加锁。锁表

具体来说:

当对表执行ALTER TABLE操作时,增字MySQL默认会对表进行加锁,段索阻止其他事务对该表的锁表读写操作,直到ALTER TABLE操作完成。增字

这种锁表行为对于小表或非高并发场景下影响不大。段索

但当数据量巨大或业务高并发时,锁表锁表问题可能会导致严重的性能瓶颈,甚至引发服务崩溃。

锁表的具体影响

当MySQL执行加字段操作时,锁表会导致以下问题:

查询等待:

所有查询该表的SQL语句将被阻塞,直到表锁释放。

写操作被阻止:

所有写入该表的操作(如INSERT、云服务器UPDATE、DELETE)将处于等待状态,直到锁释放。

系统响应变慢:

当锁表操作长时间未完成时,业务系统的整体性能将会显著下降,甚至引发宕机。

不过,在新版的MySQL 中,使用 InnoDB 存储引擎给数据表增加一列时,并不一定会锁表。

InnoDB 存储引擎提供了一些机制来减少对表的锁定,以提高并发性能。

在 MySQL 中,给数据表增加一列,是否会锁表取决于使用的存储引擎以及 MySQL 的版本。

MySQL5.6之前

之前版本的 MySQL 中,如果使用 ALTER TABLE 命令来增加一列,对于使用 InnoDB 存储引擎的表,默认情况下会锁表。

这意味着在操作执行期间,表将被锁定,其他读取和写入操作将被阻止,直到操作完成。

这种全表锁定行为会导致在大型表上执行 ALTER TABLE 操作时,产生长时间的高防服务器锁等待和应用的停顿。

所以:MySQL5.6版本之前,直接修改表结构的过程中会锁表。

具体操作步骤如下:

首先创建新的临时表,表结构通过命令ALTAR TABLE新定义的结构。

然后把原表中数据导入到临时表。

删除原表。

最后把临时表重命名为原来的表名。

MySQL5.6和MySQL8.0版本中对锁表问题做了优化!

MySQL5.6

从 MySQL5.6 开始,InnoDB 引入了在线 DDL (Online DDL)操作,允许一些表修改操作在不锁定表的情况下进行。

增加一列是一个在线操作,可以使用 ALGORITHM=INPLACE 来避免全表锁定。

复制ALTER TABLE your_table ADD COLUMN new_column INT ALGORITHM=INPLACE, LOCK=NONE;1.

ALGORITHM=INPLACE 表明使用就地算法来进行修改,这是在线DDL操作的一部分。

明确指示 MySQL 尝试在原地修改表结构。MySQL 将尝试尽可能在不重新创建整个表的情况下应用修改。

LOCK=NONE 表示尽量不锁表,最大程度减少对并发查询的影响。

允许其他会话对表进行读写操作。但可能会导致数据不一致的站群服务器情况。

这样执行效率会高很多。而且不会锁表。

不过也分为2种情况:

增加非空列:

会执行一个快速的元数据操作,不会锁定整个表:

在修改期间,其他会话可以继续读取和写入表数据。

增加可为空列:

会执行一个快速的元数据操作,不会锁定整个表:

其他会话可以继续读取和写入表数据,但在修改期间,可能会有一些短暂的行锁定。

注意:

尽管 InnoDB 存储引擎提供了较少的锁定,但在执行 ALTER TABLE 语句时仍可能会有一些性能影响。

由于内部的元数据操作、数据重组或日志写入等引起的。

因此,在对大型表进行结构修改时,仍建议在低负载时执行,以最小化对应用程序的影响。

MySQL8.0

MySQL8.0 引入了一些新的特性,使得大多数的 ALTER TABLE 操作可以在不锁定表的情况下完成。

简单说:提高了在线 DDL 操作的能力。

在 MySQL8.0 中默认情况下,简单的 ALTER TABLE 操作(如增加一列)通常不会锁定表。

要确认某个特定的 ALTER TABLE 操作是否会锁表,可以在操作执行前使用 EXPLAIN 语句:

复制EXPLAIN ALTER TABLE your_table ADD COLUMN new_column INT;1.

该命令将显示操作的执行计划信息,包括是否会锁定表。

下面是MySQL8.0的一些具体优化!

原子DDL:

MySQL8.0 引入了原子 DDL(Atomic DDL)操作,这意味着 ALTER TABLE 语句的执行过程中将会有更少的阻塞。

在增加字段的情况下,原子 DDL 机制可以减少对表的锁定时间,并允许其他会话继续读取和写入数据。

立即更新元数据:

MySQL8.0 在增加字段时立即更新表的元数据,而不需要等待整个操作完成。

这样可以更快地完成 ALTER TABLE 操作,并减少对表的锁定时间。

InnoDB引擎优化:

MySQL8.0 的 InnoDB 存储引擎针对大数据表的结构修改进行了一些优化。

例如,对于增加非空字段,InnoDB 不再需要复制整个表的数据。

相反,它会使用一种更轻量级的操作来添加新字段,从而减少锁定时间和资源消耗。

增量元数据更新:

MySQL8.0 引入了增量元数据更新,这意味着在 ALTER TABLE 操作期间只需更新受影响的元数据信息,而不是整个表。

这样可以减少锁定时间和操作的开销。

Online DDL

在线DDL(Online DDL)是指在数据库运行状态下执行(DDL)操作。

例如创建、修改或删除表结构、索引等操作,而不会造成数据库的长时间锁定或无法使用。

传统的DDL操作通常需要对受影响的表进行排他锁定。

这可能导致其他会话无法对该表进行读写操作,从而影响了数据库的正常使用。

目前支持的主流算法有三种:

COPY

MySQL5.6之前非Online,都是执行这种算法。

INPLACE

MySQL5.6出现的。

INSTANT

MySQL8.0.12出现的(腾讯DBA团队贡献)。

基本原理

在DDL操作,执行时,不管何种算法,都会经历三个阶段:

准备阶段、执行阶段DDL、提交阶段。

不同之处是,在三个阶段中分别做了不同的优化处理。

具体实现细节可以见官方文档:

https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl.html

https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl.html

总结

MySQL5.6之后,实际单纯的增加一个字段,表结构修改和索引添加通常不会锁定整个表。

在某些情况下,MySQL可能需要锁定整个表。

同时数据量过大的时候,会出现一些性能问题。

所以实际操作的过程中,要关注表的数据多小,最终的数据大小(要关注索引数据)。

同时如果你的 MySQL 版本较旧或出于某些特殊原因不支持在线 DDL 操作。

需要特别注意在非高峰期执行 ALTER TABLE 操作,以尽量减少对业务的影响。

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • CAD2020电脑安装教程(学会在电脑上正确安装CAD2020软件,助您轻松开启设计之旅)

    CAD2020电脑安装教程(学会在电脑上正确安装CAD2020软件,助您轻松开启设计之旅)

    2025-11-05 15:51

  • 以胜算充电宝(胜算充电宝-为你的移动设备提供安全可靠的能量支持)

    以胜算充电宝(胜算充电宝-为你的移动设备提供安全可靠的能量支持)

    2025-11-05 15:13

  • 高景一号(领先技术、全球服务,高景一号为人类探索太空铺就道路)

    高景一号(领先技术、全球服务,高景一号为人类探索太空铺就道路)

    2025-11-05 14:55

  • 成指纹密码锁(成指纹密码锁的特点、使用方法及用户体验)

    成指纹密码锁(成指纹密码锁的特点、使用方法及用户体验)

    2025-11-05 13:20

网友点评
精彩导读
假如你想清理你的 Ubuntu 主机,你可以按照以下的一些简单步骤来移除所有不需要的垃圾文件。移除多余软件包这又是一个内置功能,但这次我们不必使用新得立包管理软件(Synaptic Package Manager),而是在终端中达到目的。现在,在终端窗口中键入如下命令:复制代码代码如下:sudo apt-get autoclean这便激活了包清除命令。这个命令所做的工作是: 自动清除那些当你安装或升级程序时系统所缓存的 .deb 包(即清除 /var/cache/apt/archives 目录,不过只清理过时的包)。假如需要使用清除命令,只需在终端窗口中键入以下命令:复制代码代码如下:sudo apt-get clean然后你就可以使用自动移除命令。这个命令所做的工作是:清除那些 在系统中被某个已经卸载的软件 作为依赖所安装的软件包。要使用自动移除命令,在终端窗口中键入以下命令:复制代码代码如下:sudo apt-get autoremove移除不需要的本地化数据为达到此目的,我们需要安装 localepurge 软件,它将自动移除一些不需要的本地化数据(LCTT 译注:即各种语言翻译)。这个软件是一个简单的脚本,它将从那些不再需要的本地化文件和本地化联机手册( man pages ) 所占用的空间中回收磁盘空间。这个软件将在任何 apt 安装命令运行时 被自动激活。在 Ubuntu 中安装 localepurge:复制代码代码如下:sudo apt-get install localepurge在通过 apt-get install 安装任意软件后, localepurge 将移除所有不是使用你系统中所设定语言的翻译文件和翻译的联机手册。假如你想设置 localepurge,你需要编辑 /ect/locale.nopurge 文件。根据你已经安装的软件,这将为你节省几兆的磁盘空间。例子:假如我试着使用 apt-get 来安装 dicus软件:复制代码代码如下:sudo apt-get install discus在软件安装完毕之后,你将看到如下提示:复制代码代码如下:localepurge: Disk space freed in /usr/share/locale: 41860K移除孤包假如你想移除孤包,你需要安装 deborphan 软件:在 Ubuntu 中安装 deborphan :复制代码代码如下:sudo apt-get install deborphan使用 deborphan,打开终端并键入如下命令即可:复制代码代码如下:sudo deborphan | xargs sudo apt-get -y remove --purge使用 GtkOrphan 来移除孤包GtkOrphan (一个针对 debian 系发行版本的 Perl/Gtk2 应用) 是一个分析用户安装过程状态并查找孤立库文件的图形化工具,它为 deborphan 提供了一个 GUI 前端,并具备移除软件包的功能。在 Ubuntu 中安装 GtkOrphan,打开终端并运行如下命令:复制代码代码如下:sudo apt-get install gtkorphan一张截图使用 Wajig 移除孤包Wajig是 Debian 包管理系统中一个简单的软件包管理前端。它将 apt、apt-cache、 dpkg、 /etc/init.d 中的脚本等 通过一个单一命令集成在一起,它的设计初衷是使用简单和为它的所有功能提供丰富的文档。通过适当的 sudo配置,大多数(假如不是全部)的软件包安装和创建等任务可以通过一个用户 shell 来完成。Wajig 也适用于一般的系统管理。另外,一个 Gnome GUI 命令 gjig也被囊括在这个软件包之中。在 Ubuntu 中安装 Wajig,打开终端并运行如下命令:复制代码代码如下:sudo apt-get install wajigDebfoster --- 跟踪你在安装过程中的操作debfoster 将会维护一个列有被明确需要安装的软件包的列表,但不包括那些作为某个软件的依赖而被安装的软件包。参数是完全可选的,你甚至可以使得在 dpkg 和/或 apt-get 每次运行之后马上激活 debfoster 。另外,你还可以在命令行中使用 debfoster 来安装或移除某些特定的软件包。那些后缀为 --- 的软件包将会被移除,而没有后缀的软件包将会被安装。假如一个新的软件包或 debfoster 注意到作为某个软件包的依赖的软件包是一个孤包,则 debfoster 将会询问你下一步如何操作。若你决定保留这个孤包, debfoster 将只会进行记录并继续安装过程;若你觉得这个软件包不足以引起你的兴趣,在 debfoster 询问这个问题后,它将移除这个软件包。进一步的,假如你的决定使得其他的软件包变为孤包,更多的提问将会接踵而来。在 Ubuntu 中安装 debfoster,打开终端并运行如下命令:复制代码代码如下:sudo apt-get install debfoster使用 debfoster为了创建一个初始跟踪文件,可以使用如下命令:复制代码代码如下:sudo debfoster -q你总可以编辑 /var/lib/debfoster/keepers 文件,来定义那些你想留在系统中的软件包。为了编辑这个文件,可以键入:复制代码代码如下:sudo vi /var/lib/debfoster/keepers要强制使 debfoster 去移除所有没有被列在上面这个文件的软件包,或安装作为某些列在这个文件中的软件包的依赖,它也同时会添加所有在这个列表中没有被安装的软件包。若要根据这个列表来执行相关操作,只需执行:复制代码代码如下:sudo debfoster -f若需要跟踪你新安装的软件包,你需要时不时地执行如下命令:复制代码代码如下:sudo debfosterxdiskusage -- 查看你的硬盘空间都去哪儿了图形化地展示磁盘使用情况的 du。xdiskusage 是一个用户友好型的程序,它将为你展示你所有磁盘的使用情况。 它是在 Phillip C. Dykstra 所写的 “xdu” 程序的基础上设计的。做了一些修改以使得它可以为你运行 “du”命令,并显示磁盘的剩余空间,并且假如你想清晰地了解你的磁盘空间都去哪儿了,它还可以生成一个 PostScript 格式的名为 display.xdiskusage 的文件。在 Ubuntu 中安装 xdiskusage,只需使用如下命令:复制代码代码如下:sudo apt-get install xdiskusage若你想打开这个应用,你需要使用如下命令:复制代码代码如下: sudo xdiskusage一旦这个应用被打开,你将看到如下图所示的界面:BleachbitBleachBit 能快速地释放磁盘空间并不知疲倦地保护你的隐私。它可以释放缓存,删除 cookie,清除 Internet 上网历史,粉碎临时文件,删除日志,丢弃你所不知道存在何处的垃圾。为 Linux 和 Windows 系统而设计,它支持擦除清理数以千计的应用程序,如 Firefox, Internet Explorer, Adobe Flash, Google Chrome, Opera, Safari 等等。除了简单地删除文件,BleachBit 还包括许多高级功能,诸如粉碎文件以防止恢复,擦除磁盘空间来隐藏被其他应用程序所删除文件的痕迹,为火狐“除尘”,使其速度更快等。比免费更好,BleachBit 是一个开源软件。在 Ubuntu 中安装 Bleachbit,打开终端并运行如下命令:复制代码代码如下:sudo apt-get install bleachbit一张截图

假如你想清理你的 Ubuntu 主机,你可以按照以下的一些简单步骤来移除所有不需要的垃圾文件。移除多余软件包这又是一个内置功能,但这次我们不必使用新得立包管理软件(Synaptic Package Manager),而是在终端中达到目的。现在,在终端窗口中键入如下命令:复制代码代码如下:sudo apt-get autoclean这便激活了包清除命令。这个命令所做的工作是: 自动清除那些当你安装或升级程序时系统所缓存的 .deb 包(即清除 /var/cache/apt/archives 目录,不过只清理过时的包)。假如需要使用清除命令,只需在终端窗口中键入以下命令:复制代码代码如下:sudo apt-get clean然后你就可以使用自动移除命令。这个命令所做的工作是:清除那些 在系统中被某个已经卸载的软件 作为依赖所安装的软件包。要使用自动移除命令,在终端窗口中键入以下命令:复制代码代码如下:sudo apt-get autoremove移除不需要的本地化数据为达到此目的,我们需要安装 localepurge 软件,它将自动移除一些不需要的本地化数据(LCTT 译注:即各种语言翻译)。这个软件是一个简单的脚本,它将从那些不再需要的本地化文件和本地化联机手册( man pages ) 所占用的空间中回收磁盘空间。这个软件将在任何 apt 安装命令运行时 被自动激活。在 Ubuntu 中安装 localepurge:复制代码代码如下:sudo apt-get install localepurge在通过 apt-get install 安装任意软件后, localepurge 将移除所有不是使用你系统中所设定语言的翻译文件和翻译的联机手册。假如你想设置 localepurge,你需要编辑 /ect/locale.nopurge 文件。根据你已经安装的软件,这将为你节省几兆的磁盘空间。例子:假如我试着使用 apt-get 来安装 dicus软件:复制代码代码如下:sudo apt-get install discus在软件安装完毕之后,你将看到如下提示:复制代码代码如下:localepurge: Disk space freed in /usr/share/locale: 41860K移除孤包假如你想移除孤包,你需要安装 deborphan 软件:在 Ubuntu 中安装 deborphan :复制代码代码如下:sudo apt-get install deborphan使用 deborphan,打开终端并键入如下命令即可:复制代码代码如下:sudo deborphan | xargs sudo apt-get -y remove --purge使用 GtkOrphan 来移除孤包GtkOrphan (一个针对 debian 系发行版本的 Perl/Gtk2 应用) 是一个分析用户安装过程状态并查找孤立库文件的图形化工具,它为 deborphan 提供了一个 GUI 前端,并具备移除软件包的功能。在 Ubuntu 中安装 GtkOrphan,打开终端并运行如下命令:复制代码代码如下:sudo apt-get install gtkorphan一张截图使用 Wajig 移除孤包Wajig是 Debian 包管理系统中一个简单的软件包管理前端。它将 apt、apt-cache、 dpkg、 /etc/init.d 中的脚本等 通过一个单一命令集成在一起,它的设计初衷是使用简单和为它的所有功能提供丰富的文档。通过适当的 sudo配置,大多数(假如不是全部)的软件包安装和创建等任务可以通过一个用户 shell 来完成。Wajig 也适用于一般的系统管理。另外,一个 Gnome GUI 命令 gjig也被囊括在这个软件包之中。在 Ubuntu 中安装 Wajig,打开终端并运行如下命令:复制代码代码如下:sudo apt-get install wajigDebfoster --- 跟踪你在安装过程中的操作debfoster 将会维护一个列有被明确需要安装的软件包的列表,但不包括那些作为某个软件的依赖而被安装的软件包。参数是完全可选的,你甚至可以使得在 dpkg 和/或 apt-get 每次运行之后马上激活 debfoster 。另外,你还可以在命令行中使用 debfoster 来安装或移除某些特定的软件包。那些后缀为 --- 的软件包将会被移除,而没有后缀的软件包将会被安装。假如一个新的软件包或 debfoster 注意到作为某个软件包的依赖的软件包是一个孤包,则 debfoster 将会询问你下一步如何操作。若你决定保留这个孤包, debfoster 将只会进行记录并继续安装过程;若你觉得这个软件包不足以引起你的兴趣,在 debfoster 询问这个问题后,它将移除这个软件包。进一步的,假如你的决定使得其他的软件包变为孤包,更多的提问将会接踵而来。在 Ubuntu 中安装 debfoster,打开终端并运行如下命令:复制代码代码如下:sudo apt-get install debfoster使用 debfoster为了创建一个初始跟踪文件,可以使用如下命令:复制代码代码如下:sudo debfoster -q你总可以编辑 /var/lib/debfoster/keepers 文件,来定义那些你想留在系统中的软件包。为了编辑这个文件,可以键入:复制代码代码如下:sudo vi /var/lib/debfoster/keepers要强制使 debfoster 去移除所有没有被列在上面这个文件的软件包,或安装作为某些列在这个文件中的软件包的依赖,它也同时会添加所有在这个列表中没有被安装的软件包。若要根据这个列表来执行相关操作,只需执行:复制代码代码如下:sudo debfoster -f若需要跟踪你新安装的软件包,你需要时不时地执行如下命令:复制代码代码如下:sudo debfosterxdiskusage -- 查看你的硬盘空间都去哪儿了图形化地展示磁盘使用情况的 du。xdiskusage 是一个用户友好型的程序,它将为你展示你所有磁盘的使用情况。 它是在 Phillip C. Dykstra 所写的 “xdu” 程序的基础上设计的。做了一些修改以使得它可以为你运行 “du”命令,并显示磁盘的剩余空间,并且假如你想清晰地了解你的磁盘空间都去哪儿了,它还可以生成一个 PostScript 格式的名为 display.xdiskusage 的文件。在 Ubuntu 中安装 xdiskusage,只需使用如下命令:复制代码代码如下:sudo apt-get install xdiskusage若你想打开这个应用,你需要使用如下命令:复制代码代码如下: sudo xdiskusage一旦这个应用被打开,你将看到如下图所示的界面:BleachbitBleachBit 能快速地释放磁盘空间并不知疲倦地保护你的隐私。它可以释放缓存,删除 cookie,清除 Internet 上网历史,粉碎临时文件,删除日志,丢弃你所不知道存在何处的垃圾。为 Linux 和 Windows 系统而设计,它支持擦除清理数以千计的应用程序,如 Firefox, Internet Explorer, Adobe Flash, Google Chrome, Opera, Safari 等等。除了简单地删除文件,BleachBit 还包括许多高级功能,诸如粉碎文件以防止恢复,擦除磁盘空间来隐藏被其他应用程序所删除文件的痕迹,为火狐“除尘”,使其速度更快等。比免费更好,BleachBit 是一个开源软件。在 Ubuntu 中安装 Bleachbit,打开终端并运行如下命令:复制代码代码如下:sudo apt-get install bleachbit一张截图

热门资讯