暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

OceanBase系统架构唯一索引和非唯一索引及索引的使用

2023-12-12
663

索引表分为唯一索引和非唯一索引,其中唯一索引保证在表内的索引列上不存在两行有完全相同的值,而非唯一索引则可能存在完全相同的值。在 OceanBase 数据库中,NULL 值也会存储在索引中。

对于非唯一索引,索引表的存储键是用户指定的索引列和主表主键;而对于唯一索引列,索引表的存储键是用户指定的索引列和可变的主表主键列,这里可变的含义是主键列的值是随索引列值的不同而不同。

如下例所示,对于非唯一索引表 i1,它的存储键是 c2 和 c1,而对于唯一索引表 i2,它的存储键是 c3,而 c1 是可变的。当 c3 为 NULL 时,可变的 c1 列值是主表 c1 列的值;当 c3 不为 NULL 时,可变的 c1 列值为 NULL

CREATE TABLE t1(c1 INT, c2 INT, c3 INT, c4 INT, PRIMARY KEY(c1));
CREATE INDEX i1 ON t1(c2);
CREATE UNIQUE INDEX i2 ON t1(c3);


当用户创建好索引后,OceanBase 数据库会自动维护该索引,所有的 DML 操作都会实时更新索引表相应的数据记录,同时优化器也会根据用户的查询来自动地选择是否使用索引。本文主要介绍如何进行索引扫描。

当 SQL 查询语句指定谓词条件查询的是索引列时,数据库会自动地抽取谓词条件作为查询索引的范围,也就是查询索引表的起始键和终止键。数据库根据起始键能定位到数据开始的位置,根据终止键能定位出数据结束位置,而开始和结束位置范围内所包含的数据是需要被此查询扫描的数据。

对于索引表,OceanBase 数据库存储时使用 MemTable 和 SSTable 来存储数据,其中 MemTable 使用的是B+ 树结构,而 SSTable 使用的是宏块结构。在 MemTable 或者 SSTable 都按照上述扫描过程,扫描出相应的数据,而最终的数据行是由 MemTable 和 SSTable 的数据行融合成完整的数据行。

因此,OceanBase 数据库查询索引表数据的完整过程如下:

  1. 在 MemTable 中查询数据。

  2. 在 SSTable 中查询数据。

  3. 将 MemTable 和 SSTable 中的数据融合,得到完整的行。

当 SQL 查询语句只涉及到索引表中的列时,那么数据库会根据用户指定的列,按照上述查询过程,查询相应索引表的 MemTable 和 SSTable,得到完整的数据行。

当 SQL 查询语句除了包含索引表中的列,还包含其他列时,数据库会先通过索引表,查询出相关的行,并根据行上的主键,按照上述查询过程,到主表中查询所需要的数据列,这个过程也称为回表。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论