二级索引

当某些应用需要使用不同属性作为查询条件来执行数据查询时,您可以通过将这些属性作为二级索引的主键列实现按照属性快速查询数据的需求。表格存储提供了本地二级索引和全局二级索引来满足您不同读取一致性要求的查询场景。本文介绍了二级索引的基本概念、索引类型、功能特性、注意事项等信息。

背景信息

表格存储的数据表是通过指定主键来实现表中数据的查询。但是,通常情况下很多应用可能需要通过数据表主键以外的属性对数据进行查询。为了解决此问题,您可以为数据表创建一个或多个二级索引,然后使用索引表查询数据。

二级索引相当于把数据表的主键查询能力扩展到了不同的列,使用二级索引能加快数据查询的效率。创建二级索引时,您需要将要查询的多个属性作为索引表的主键列,然后使用索引表的主键列快速查询所需数据。具体样例场景说明请参见使用场景

基本概念

名词

描述

索引表

对数据表中某些列数据的索引。

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

预定义列

在创建数据表时预先定义一些非主键列以及其类型,作为索引表的索引列或者属性列。

说明

表格存储为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列时,不会为此行建立索引。

使用限制

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

注意事项

创建索引表时的注意事项

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

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

    使用全局二级索引时,根据实际需要创建索引。

    • 如果在Defined0上创建索引,则生成的索引表主键会是Defined0、PK0、PK1三列。

    • 如果在Defined0PK1上创建索引,则生成的索引表主键会是Defined0、PK1、PK0三列。

    • 如果在PK1上创建索引,则生成的索引表主键会是PK1、PK0两列。

    使用本地二级索引时,索引表的第一个主键列必须与数据表的第一个主键列相同。

    • 如果在PK0Defined0上创建索引,则生成的索引表主键会是PK0、Defined0、PK1三列。

    • 如果在PK0、PK1Defined0上创建索引,则生成的索引表主键会是PK0、PK1、Defined0三列。

    • 如果在PK0PK1上创建索引,则生成的索引表主键会是PK0、PK1两列。

  • 根据查询模式和成本的考虑选择合适的数据表预定义列作为索引表属性列。

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

  • 使用全局二级索引时,请选择合适的列作为索引表的第一个主键列。

    • 由于可能导致索引表更新速度变慢,不建议把时间相关列作为索引表主键的第一列。

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

    • 由于会导致索引表水平扩展能力受限,影响索引表写入性能,不建议将取值范围非常小,甚至可枚举的列作为索引表主键的第一列,例如性别。

使用索引表时的注意事项

  • 在带有索引表的数据表中写入数据时需遵循如下规则,否则在数据表中写入数据会失败。

    • 写入数据时,不能自定义数据的版本号。

    • 批量写入数据时,一个批量写请求中,同一行数据(即主键相同)不能重复存在。

  • 索引表只能用于查询数据,不能直接写入数据。

接口

使用二级索引的相关接口请参见下表。

接口

说明

CreateIndex

为已存在的数据表创建索引表。

说明
  • 目前使用CreateIndex单独创建的索引表中可以选择包含或者不包含在数据表执行CreateIndex前已存在的数据。

  • 您也可以使用CreateTable接口在创建数据表的同时创建一个或者多个索引表。

GetRow

单行读取索引表中数据。

GetRange

范围读索引表中数据。

DropIndex

删除数据表上指定的索引表。

重要

使用DeleteTable接口删除数据表前,必须先删除数据表下的索引,否则数据表将删除失败。

使用方式

您可以通过控制台、命令行工具或者SDK使用二级索引。

计费说明

使用二级索引功能将产生额外的数据存储量。当向数据表写入数据时,在建立索引的过程中以及读取数据时会消耗计算资源。

表格存储包括VCU模式(原预留模式)和CU模式(原按量模式)两种计费模式。使用不同的计费模式时,计费方式不同。

计费模式

计费说明

VCU模式(原预留模式)

VCU模式(原预留模式)以包年包月方式预先购买计算能力,计算能力中涵盖二级索引操作、读写数据的计算消耗。

索引的数据存储量与数据表无区别,按照不同存储类型收费。更多信息,请参见数据存储量

CU模式(原按量模式)

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

CU模式(原按量模式)是根据实际计算消耗折算成CU进行计费。同时根据实例规格不同,计费时需要区分按量读写CU以及预留读写CU。

索引表数据存储量与数据表无区别,数据存储类型与实例规格绑定。更多信息,请参见数据存储量

说明

关于实例规格和CU的更多信息,请分别参见实例读写吞吐量

相关文档

如果需要更灵活丰富的数据加速查询方式,例如多条件组合查询、全文检索、前缀查询、模糊查询等,您可以使用多元索引实现。更多信息,请参见多元索引简介

常见问题