MySQL 5.6之前,所有ALTER TABLE操作(包括添加索引)默认锁表,期间阻塞所有DML(增删改查)操作。MySQL 5.6及更高版本:InnoDB引擎支持在线DDL,允许在不锁表的前提下创建普通索引,但仍需短暂持有元数据锁(MDL)以保证结构一致性。MySQL 8.0优化新增Instant DDL特性,部分操作(如添加可为空列)几乎瞬时完成,进一步减少锁冲突风险。
InnoDB:支持行级锁和在线DDL,普通索引创建通常无需锁表,但添加唯一索引可能短暂限制写操作。
麻烦请教一下:
OceanBase 4.x 版本,比如企业版4.2.1 或者 obcloud 4.2.1, mysql租户创建普通索引、创建唯一索引、添加列 是否会锁表?
3 个赞
论坛小助手
#4
根据文档库中的信息,针对 OceanBase 4.x 版本(包括企业版 4.2.1 或 obcloud 4.2.1)在 MySQL 租户下的操作行为,以下是关于创建索引和添加列是否会锁表的详细解答:
1. OceanBase 的锁机制概述
- OceanBase 数据库目前不支持表锁,只支持行锁,并且仅存在互斥行锁(参考文档片段 5)。这意味着传统意义上的表级锁定在 OceanBase 中并不存在。
- 在 OceanBase 数据库中,DDL 操作通过在线 DDL 变更实现,尽量减少对业务的影响。
2. 创建普通索引
-
是否锁表:OceanBase 支持在线 DDL,创建普通索引时不会锁表。与 MySQL 类似,OceanBase 在此过程中会短暂持有元数据锁(MDL),以确保结构一致性。
-
延迟生效:需要注意的是,OceanBase 创建普通索引是异步执行的,通常 T+1 生效(参考文档片段 7)。在此期间,虽然不会锁表,但索引尚未完全可用。
3. 创建唯一索引
-
是否锁表:创建唯一索引时也不会锁表,但与普通索引类似,唯一索引的创建是异步执行的,通常 T+2 生效(参考文档片段 7)。在此期间,虽然不会锁表,但索引尚未完全可用。
-
写操作限制:由于唯一性约束的存在,在创建唯一索引的过程中,可能会对写操作(如插入或更新)产生短暂限制,以确保唯一性检查的一致性。
4. 添加列
-
是否锁表:OceanBase 支持在线 DDL,添加列的操作不会锁表。类似于 MySQL 的 Instant DDL 特性,OceanBase 的添加列操作可以几乎瞬时完成,尤其是当新增列允许为 NULL 时。
-
注意事项:如果新增列设置了默认值,并且该默认值需要回填到现有数据中,则可能会涉及一定的后台扫描和更新操作,但这仍然不会导致表级锁定。
5. 总结对比
操作类型 |
是否锁表(OceanBase 4.x) |
备注 |
创建普通索引 |
否 |
异步执行,T+1 生效;短暂持有 MDL。 |
创建唯一索引 |
否 |
异步执行,T+2 生效;可能对写操作有短暂限制。 |
添加列 |
否 |
如果需要回填默认值,可能会涉及后台扫描,但不会锁表。 |
6. 补充说明
-
MySQL 模式下的特殊性:上述行为适用于 OceanBase 的 MySQL 租户模式。对于 Oracle 租户模式,某些行为可能会有所不同,但问题中明确提到的是 MySQL 租户,因此未涉及 Oracle 模式的相关内容。
-
建议实践:为了避免潜在的性能影响,建议在业务低峰期进行索引创建或列添加操作,并遵循最佳实践(如先新增索引再删除旧索引,参考文档片段 7 的正确代码示例)。
希望以上解答能够解决您的疑问!如果还有其他相关问题,请随时提问。
具体信息可参考以下文档:
- 创建表组
- 更改表
- CREATE INDEX
- 使用 MySQL 租户做常见数据库开发
- 锁机制
- 索引设计
- Schema 规范
- OceanBase 数据库在 MySQL 模式租户下的扩展功能
- LOCK TABLES
1 个赞
甯空
#7
4.3.5,我试了下加个普通索引30秒,,期间CURD都能正常。
1 个赞
好的 感谢!
但是 1 “ *OceanBase 数据库目前不支持表锁,只支持行锁,并且仅存在互斥行锁(参考文档片段 5)。这意味着传统意义上的表级锁定在 OceanBase 中并不存在。”
这句描述是不是不对呀, 3.x只有行锁没有表锁。 4.x 应该支持表锁了吧。
甯空
#11
霜老师,问下,没有找到像MYSQL那样详细介绍OB的锁工作原理的文档呀,你有吗?
辞霜
#13
甯空
#14
这个我看了,上面是我总结的,在锁方面看来就是比MYSQL简洁。