OB在创建索引时,会产生独占表锁吗?会影响其它的DML操作吗?

OB在创建索引时,会产生独占表锁吗?会影响其它的DML操作吗?

我理解,
local索引一般不会加锁;global索引可能会加锁
读操作无锁不影响,写操作会堵塞。
可以了解下odc的无锁变更,也许有价值

1 个赞

@论坛小助手

根据文档库中的信息,OceanBase 数据库在创建索引时的行为如下:

  1. 关于表锁

    • 在 OceanBase 社区版中,目前并不支持通过 LOCK TABLES 语句实现的表锁功能(参考文档:《锁表》)。因此,在社区版中,创建索引时不会因为表锁机制而产生独占表锁。
    • 然而,需要注意的是,尽管没有显式的表锁,创建索引的过程本身可能会对表施加一定的内部锁定机制以确保数据一致性。这种锁定可能会影响并发的 DML 操作。
  2. 对 DML 操作的影响

    • 创建索引是一个元数据变更操作,通常会涉及一定的资源占用和内部锁定。在此期间,DML 操作可能会受到影响,具体表现为:
      • 如果创建的是本地索引(LOCAL),由于其与分区数据共用分区,DML 操作可能会受到一定限制,尤其是在分区键相关的场景下。
      • 如果创建的是全局索引(GLOBAL),由于其为独立分区,DML 操作可能因此产生分布式事务,从而进一步影响性能(参考文档:《使用 OceanBase 数据库分区表进行水平拆分 → 分区表 → 分区表的索引》)。
  3. 总结

    • 在 OceanBase 数据库中,创建索引时虽然不会显式地产生独占表锁(社区版不支持表锁功能),但内部机制可能会对表施加一定的锁定,进而影响其他 DML 操作。
    • 建议尽量在低峰时段执行创建索引的操作,以减少对业务的影响。

如果需要更详细的测试结果或具体的性能评估,建议通过实际测试验证不同场景下的行为。

具体信息可参考以下文档:

  1. 锁机制
  2. 使用 MySQL 租户做常见数据库开发
  3. 索引概述
  4. 创建索引
  5. 使用 OceanBase 数据库分区表进行水平拆分
  6. 锁表
  7. 集群管理 FAQ
  8. 索引设计

创建索引时不会产生独占表锁,但会对涉及的行或索引项加锁