通过本文您可以了解二级索引的区别、基本概念、注意事项、功能等。

背景

通过创建一张或多张索引表,使用索引表的主键列查询,二级索引相当于把数据表的主键查询能力扩展到了不同的列。使用二级索引能加快数据查询的效率。

为了满足用户的强一致性查询等需求,表格存储在支持全局二级索引的同时,推出了本地二级索引。

二级索引区别

二级索引包括全局二级索引和本地二级索引,请根据实际需要选择合适的二级索引。

名称 区别
全局二级索引
  • 以异步方式将数据表中被索引的列和主键列的数据自动同步到索引表中,正常情况下同步延迟达到毫秒级别。
  • 索引表的第一列主键可根据需要选择任意主键列或者预定义列。
本地二级索引
  • 以同步方式将数据表中被索引的列和主键列的数据自动同步到索引表中,当数据写入数据表后,即可从索引表中查询到数据。
  • 索引表的第一列主键必须和数据表的第一列主键相同。

基本概念

名词 描述
索引表 对数据表中某些列数据的索引。

索引表只能用于读取数据,不能写入数据。

预定义列 在创建数据表时预先定义一些非主键列以及其类型,作为索引表属性列。
说明 表格存储为Schema-free模型,原则上一行数据可以写入任意属性列,无需在SCHEMA中指定属性列。
单列索引 只为某一列建立索引。
组合索引 多个列组合成索引,组合索引中包含组合索引列1、列2。
索引表属性列 被映射到索引表中的预定义列。
索引列补齐 系统自动将未出现在索引列中的数据表主键补齐到索引表主键中。

功能

  • 单列索引和组合索引

    支持为数据表中的某一列或者多个列建立索引。

  • 索引同步
    全局二级索引和本地二级索引的数据同步方式不同。
    • 使用全局二级索引时,表格存储以异步方式将数据表中被索引的列和主键列的数据自动同步到索引表中,正常情况下同步延迟达到毫秒级别。
    • 使用本地二级索引时,表格存储以同步方式将数据表中被索引的列和主键列的数据自动同步到索引表中,当数据写入数据表后,即可从索引表中查询到数据。
  • 覆盖索引(Covered Indexes)

    支持索引表中带有属性列。在创建数据表时预先定义一些列(称为预定义列)后,可以对任意预定义列和数据表主键列进行索引,指定数据表的若干个预定义列作为索引表属性列。索引表中也可以不包含任何属性列。

    当指定数据表的若干个预定义列作为索引表属性列时,读取索引表可以直接得到数据表中对应预定义列的值,无需反查数据表。

  • 存量索引

    支持新建的索引表中包含数据表中的存量数据。

  • 稀疏索引(Sparse Indexes)

    如果数据表的某个预定义列作为索引表的属性列,当数据表某行中不存在该预定义列时,只要索引列全部存在,仍会为此行建立索引。但是如果部分索引列缺失,则不会为此行建立索引。

    例如数据表有PK0、PK1、PK2三列主键,Defined0、Defined1、Defined2三列预定义列,设置索引表主键为PK0、Defined0、Defined1,索引表属性列为Defined2。
    • 当数据表某行的属性列中,只包含Defined0、Defined1两列,不包含Defined2列时,会为此行建立索引。
    • 当数据表某行的属性列中,只包含Defined0、Defined2两列,不包含Defined1列时,不会为此行建立索引。

使用限制

更多信息,请参见二级索引限制

注意事项

索引表的索引列和属性列设置注意事项如下:
  • 系统会自动对索引表进行索引列补齐。在对索引表进行扫描时,请注意填充对应主键列的范围(一般为负无穷到正无穷)。

    在创建索引表时,只需要指定索引列,其它列会由系统自动添加。例如数据表有PK0和PK1两列主键,Defined0作为预定义列。

    使用全局二级索引时,根据实际需要创建索引。
    • 如果在Defined0上创建索引,则生成的索引表主键会是Defined0、PK0、PK1三列。
    • 如果在Defined0和PK1上创建索引,则生成的索引表主键会是Defined0、PK1、PK0三列。
    • 如果在PK1上创建索引,则生成的索引表主键会是PK1、PK0两列。
    使用本地二级索引时,索引表的第一个主键列必须与数据表的第一个主键列相同。
    • 如果在PK0和Defined0上创建索引,则生成的索引表主键会是PK0、Defined0、PK1三列。
    • 如果在PK0、PK1和Defined0上创建索引,则生成的索引表主键会是PK0、PK1、Defined0三列。
    • 如果在PK0和PK1上创建索引,则生成的索引表主键会是PK0、PK1两列。
  • 根据查询模式和成本的考虑选择合适的数据表预定义列作为索引表属性列。

    将数据表的一个预定义列作为索引表的属性列后,查询数据时无需反查数据表即可得到该列的值,但是同时增加了相应的存储成本。反之则需要根据索引表反查数据表。

  • 使用全局二级索引时,请选择合适的列作为索引表的第一个主键列。
    • 由于可能导致索引表更新速度变慢,不建议把时间相关列作为索引表主键的第一列。

      建议将时间列进行哈希,然后在哈希后的列上创建索引,如果有需求请使用钉钉联系表格存储技术支持。

    • 由于会导致索引表水平扩展能力受限,影响索引表写入性能,不建议将取值范围非常小,甚至可枚举的列作为索引表主键的第一列,例如性别。
使用索引表时的注意事项如下:
  • 在带有索引表的数据表中写入数据时需遵循如下规则,否则在数据表中写入数据会失败。
    • 写入数据时,不能自定义数据的版本号。
    • 批量写入数据时,一个批量写请求中,同一行数据(即主键相同)不能重复存在。

计量计费

更多信息,请参见二级索引计量计费