Innodb加索引,这个时候会锁表吗?

在MySQL5.6之前,InnoDB在创建索引时独占锁定表。
这意味着其他会话无法读取或修改表中的数据,这可能会导致较长的阻塞时间和性能问题。
从MySQL5.6开始,InnoDB引入了“OnlineDDL”技术,该技术允许在不阻塞其他会话的情况下创建或删除索引。
“OnlineDDL”技术采用COPY、INSTANT、INPLACE等多种实现方式来优化各种操作。
虽然DDL包括创建索引、添加字段、添加外键等多种操作,但不同的操作支持的方式不同。
具体支持方式请参考MySQL官方文档。
以创建索引为例,在执行DDL语句时,会使用“inplace”模式。
然而,虽然OnlineDDL可以减少锁定时间并影响性能,但在索引创建过程中仍然可能会出现锁定和阻塞情况。
例如,在添加索引时,如果表中有大量未提交的事务,则需要等待这些事务提交后才能开始构建索引。
因此,建议此类操作尽量在非高峰时段进行,以免影响用户的正常使用。
在实施任何DDL操作之前,最好进行适当的测试和规划,并确保您有备份和回滚计划来处理意外情况。
需要理解的是,MDL锁必须在DDL的开始和结束时获取。
如果获取锁时有未提交的事务,DDL可能会因为锁失败而阻塞,影响性能。
另外,如果OnlineDDL过程失败,其回滚过程可能会导致更高的成本。
长时间运行的OnlineDDL操作也可能会导致主从同步延迟。
MySQL5.6之前,有两种DDL算法,COPY和INPLACE。
其中,MySQL5.5中引入了INPLACE算法,以提高索引创建和删除过程的效率。
INPLACE算法实际上分为两种。
原则是尽可能使用in-place算法进行DDL操作,而不是重新创建或复制表。
MySQL中的INPLACE算法可以分为两种:一种是索引创建算法,另一种是索引删除算法。
在MySQL中使用INPLACE算法时,可以通过指定ALGORITHM参数来选择使用哪种算法。
但需要注意的是,并不是所有的DDL语句都会使用OnlineDDL进行加速。
OnlineDDL的基本原理是将DDL过程分为三个阶段:准备阶段、执行阶段、还有承诺阶段。
在setup阶段和commit阶段,会添加EXCLUSIVE-MDL锁,但这两个阶段的锁都是非常轻量级的,耗时较少。
在执行阶段,允许读写操作,在Row_log日志期间记录变更数据,最后将这些变更应用到新表中,达到OnlineDDL的效果。
在MySQL中,MDL锁是一种表级锁,适用于所有存储引擎。
所有的DML操作都会给表添加元数据读锁;所有DDL操作都会添加锁来将元数据写入表。
读锁和写锁之间的阻塞关系遵循特定的规则。
因此,使用OnlineDDL进行DDL操作时,要特别注意与MDL锁的关系,避免影响性能。
总之,InnoDB的索引构建方法、MySQL的DDL算法、OnlineDDL原理以及MDL锁的使用共同构成了优化数据库操作的核心技术。
在实施数据库管理时,了解并应用这些技术可以极大地提高系统的稳定性和性能。

mysql 添加字段

当MySQL执行字段添加操作时;数据库会进行一定程度的锁定,以保证数据的一致性。
特别是在更新操作(例如添加字段)时。
MySQL会选择锁定表或行来防止并发冲突。
然而,这种锁定机制并不总是透明的,并且会显着影响性能,因为如果表大小达到数千万,写入操作会变得更慢。
这将防止查询操作锁定。
所以,对于大型数据库,添加字段时必须小心,以尽量减少对系统性能的影响。
执行此类操作时;减少锁定对性能的影响;分成几部分;建议对数据库进行适当的优化,例如索引等。
同时,向用户提供适当的提示,告知他们潜在的性能影响和维护操作,以尽量减少不必要的问题。