当前位置: 首页 > 知识库问答 >
问题:

mysql的一张表有数据,在修改表结构时,能进行读写吗?

吕文林
2023-07-19

是不是跟“元数据锁”有关,具体原理是啥?

共有2个答案

邓昀
2023-07-19

在MySQL中,修改表结构时可以进行读写操作。元数据锁是一种用于保护表结构的锁机制,确保在修改表结构时不会对其他操作造成干扰。其他会话可以继续读取表中的数据,但如果要修改表中的数据,则需要等待元数据锁的释放。元数据锁只保护表结构,不保护表中的数据。

壤驷德宇
2023-07-19

MySQL5.7版本
对于表结构修改和索引添加,MySQL使用了一种称为“In-Place Alter”的技术。这种技术允许在不锁定表的情况下进行修改。In-Place Alter使用了一种称为“Fast Index Creation”的技术来优化索引添加,它可以在不拷贝原始表数据的情况下创建新索引。对于表结构修改,MySQL5.7使用了一种称为“Online DDL”的技术。Online DDL允许在不锁定表的情况下进行表结构修改。当修改表结构时,MySQL会创建一个新表,并将原始表中的数据复制到新表中。在复制数据期间,原始表仍然可读和可写。完成数据复制后,MySQL会将新表重命名为原始表的名称,并删除原始表。此过程通常只需要几秒钟或几分钟,并且可以在应用程序运行期间执行。
虽然In-Place Alter和Online DDL可以减少对表的锁定,但它们并不适用于所有情况。例如,在进行某些类型的表结构修改时,MySQL可能需要锁定整个表。在这种情况下,In-Place Alter和Online DDL可能不适用。此外,在MySQL5.7中,如果使用ALTER TABLE语句添加索引,将会锁定表。但是,如果使用CREATE INDEX语句添加索引,则不会锁定表。这是因为CREATE INDEX语句使用了“Concurrent Inserts”的技术,它允许在不锁定表的情况下进行索引添加。Concurrent Inserts在索引添加期间允许其他并发操作,从而减少了锁定的需求。综上所述,在MySQL5.7中,表结构修改和索引添加通常不会锁定整个表。但是,在某些情况下,MySQL可能需要锁定整个表。此外,如果使用ALTER TABLE语句添加索引,则会锁定表。相反,如果使用CREATE INDEX语句添加索引,则不会锁定表。


MySQL8.0版本
在表结构修改和索引添加方面引入了一些新的功能。其中最重要的功能是“Invisible Indexes”和“In-Place Alter”升级。“Invisible Indexes”允许您创建不会影响查询执行计划的索引。这些索引对于实时修改和测试查询计划非常有用。此外,如果某个索引不再需要,您可以将其设置为“不可见”,而不是完全删除它。这可以减少表锁定的时间,因为在删除可见索引之前不需要锁定整个表。“In-Place Alter”在MySQL8.0中进行了升级,可以处理更多类型的表结构修改。例如,现在可以在不锁定表的情况下添加、删除和更改列。如果使用In-Place Alter进行表结构修改,则MySQL将创建一个新的表,将新表中的数据与原始表中的数据进行同步,然后在删除原始表之前将新表重命名为原始表的名称。
在MySQL8.0中,索引添加的行为与MySQL5.7相同。如果使用ALTER TABLE语句添加索引,则将锁定表。相反,如果使用CREATE INDEX语句添加索引,则不会锁定表。使用“Concurrent Inserts”技术添加索引可以避免表锁定,这使得索引添加变得更加高效。此外,在MySQL8.0中,还引入了“Instant DDL”功能。这种功能允许您在不锁定表的情况下执行某些DDL操作,例如添加、删除和更改列,以及更改表类型和重命名表。这可以显著提高MySQL的可用性和可维护性。综上所述,在MySQL8.0中,表结构修改和索引添加的锁定行为与MySQL5.7大致相同。如果使用ALTER TABLE语句添加索引,则将锁定表。相反,如果使用CREATE INDEX语句添加索引,则不会锁定表。使用In-Place Alter进行表结构修改可以避免锁定整个表。此外,MySQL8.0引入了“Invisible Indexes”、“Instant DDL”和“In-Place Alter”升级等新功能,可以进一步提高MySQL的性能和可维护性。

 类似资料:
  • 主要内容:修改表名,修改表字符集修改数据表的前提是数据库中已经存在该表。修改表指的是修改数据库中已经存在的数据表的结构。修改数据表的操作也是数据库管理中必不可少的,就像画素描一样,画多了可以用橡皮擦掉,画少了可以用笔加上。 不了解如何修改数据表,就相当于是我们只要画错了就要扔掉重画,这样就增加了不必要的成本。 在 MySQL 中可以使用 ALTER TABLE 语句来改变原有表的结构,例如增加或删减列、更改原有列类型、重新命名列

  • 本文向大家介绍MySQL如何快速修改表的表结构,包括了MySQL如何快速修改表的表结构的使用技巧和注意事项,需要的朋友参考一下 快速修改MySQL某张表的表结构--摘录自《MySQL管理之道》 这个命令可以修改表结构 此外,也可以如下方法修改表结构: 先创建一张表,如下: 如果要修改name列为varchar(10)的,可以这样操作: 也可以如下操作: 1、查看表结构,如下: 2、创建临时表,把v

  • 主要内容:Oracle ALTER TABLE示例,以下是纠正/补充内容:在本教程中,我们将学习如何使用Oracle 语句来修改表结构。 要修改现有表的结构,请使用语句。 以下说明语法: 在上面的语句中, 首先,指定要修改的表名称。 其次,指出想在表名称后执行的操作。 语句可用来: 添加一个或多个列 修改列定义 删除一列或多列 重命名列 重命名表 下面来看看一些例子来了解每个操作的工作原理。 Oracle ALTER TABLE示例 我们将使用在上一个教程中创建的表进行

  • 本文向大家介绍MySQL修改表结构操作命令总结,包括了MySQL修改表结构操作命令总结的使用技巧和注意事项,需要的朋友参考一下 表的结构如下: 删除列: 添加列: 修改列,把number修改为bigint: 或者是把number修改为id,类型为bigint: 添加主键: 删除主键: 添加唯一索引: 为name这一列创建了唯一索引,索引的名字是name_unique_index. 添加普通索引:

  • 本文向大家介绍MySQL中修改表结构时需要注意的一些地方,包括了MySQL中修改表结构时需要注意的一些地方的使用技巧和注意事项,需要的朋友参考一下 MySql 在修改表结构的时候可能会中断产品的正常运行影响用户体验,甚至更坏的结果,丢失数据。不是所有的数据库管理员、程序员、系统管理员都非常了解Mysql能避免这种情况。DBA会经常碰到这种生产中断的情况,当升级脚本修改了应用层和数据库层,或者缺乏经

  • 本文向大家介绍修改SQL-SERVER数据库表结构的SQL命令附sql命令行修改数据库,包括了修改SQL-SERVER数据库表结构的SQL命令附sql命令行修改数据库的使用技巧和注意事项,需要的朋友参考一下 具体不废话了,请看下文代码详细说明吧。 向表中增加一个 varchar 列:   ALTER TABLE distributors ADD COLUMN address varchar(30)