通过本文您可以了解全局二级索引的基本概念、注意事项、功能等。
基本概念
名词 | 描述 |
---|---|
索引表 | 对数据表中某些列数据的索引。
索引表只能用于读取数据,不能写入数据。 |
预定义列 | 在创建数据表时预先定义一些非主键列以及其类型,作为索引表属性列。
说明 表格存储为Schema-free模型,原则上一行数据可以写入任意属性列,无需在SCHEMA中指定属性列。
|
单列索引 | 只为某一列建立索引。 |
组合索引 | 多个列组合成索引,组合索引中包含组合索引列1、列2。 |
索引表属性列 | 被映射到索引表中的预定义列。 |
索引列补齐 | 系统自动将未出现在索引列中的数据表主键补齐到索引表主键中。 |
功能
- 单列索引和组合索引
支持为数据表中的某一列或者多个列建立索引。
- 索引同步
支持将数据表中被索引的列和主键列的数据以异步方式自动同步到索引表中,正常情况下同步延迟达到毫秒级别。
- 覆盖索引(Covered Indexes)
支持索引表中带有属性列。在创建数据表时预先定义一些列(称为预定义列)后,可以对任意预定义列和数据表主键列进行索引,指定数据表的若干个预定义列作为索引表属性列。索引表中也可以不包含任何属性列。
当指定数据表的若干个预定义列作为索引表属性列时,读取索引表可以直接得到数据表中对应预定义列的值,无需反查数据表。例如数据表有PK0、PK1、PK2三列主键,Defined0、Defined1、Defined2三列预定义列。- 索引列可以是PK2,没有属性列或者属性列是Defined0。
- 索引列可以是PK1、PK2,没有属性列或者属性列是Defined0。
- 索引列可以是PK2、PK1、PK0,属性列是Defined0、Defined1、Defined2。
- 索引列可以是Defined0,没有属性列。
- 索引列可以是Defined0、PK1,属性列是Defined1。
- 索引列可以是Defined1、Defined0,没有属性列或者属性列是Defined2。
- 存量索引
支持新建的索引表中包含数据表中的存量数据。
- 稀疏索引(Sparse Indexes)
如果数据表的某个预定义列作为索引表的属性列,当数据表某行中不存在该预定义列时,只要索引列全部存在,仍会为此行建立索引。但是如果部分索引列缺失,则不会为此行建立索引。例如数据表有PK0、PK1、PK2三列主键,Defined0、Defined1、Defined2三列预定义列,设置索引表主键为Defined0、Defined1,索引表属性列为Defined2。
- 当数据表某行中,只包含Defined0、Defined1两列,不包含Defined2列时,会为此行建立索引。
- 当数据表某行中,只包含Defined0、Defined2两列,不包含Defined1列时,不会为此行建立索引。
使用限制
更多信息,请参见全局二级索引限制。
注意事项
索引表的索引列和属性列设置注意事项如下:
- 系统会自动对索引表进行索引列补齐。在对索引表进行扫描时,请注意填充对应主键列的范围(一般为负无穷到正无穷)。
在创建索引表时,只需要指定索引列,其它列会由系统自动添加。例如数据表有PK0和PK1两列主键,Defined0作为预定义列。
- 如果在Defined0上创建索引,则生成的索引表主键会是Defined0、PK0、PK1三列。
- 如果在Defined0和PK1上创建索引,则生成的索引表主键会是Defined0、PK1、PK0三列。
- 如果在PK1上创建索引,则生成的索引表主键会是PK1、PK0两列。
- 根据查询模式和成本的考虑选择合适的数据表预定义列作为索引表属性列。
将数据表的一个预定义列作为索引表的属性列后,查询数据时无需反查数据表即可得到该列的值,但是同时增加了相应的存储成本。反之则需要根据索引表反查数据表。
- 由于可能导致索引表更新速度变慢,不建议把时间相关列作为索引表主键的第一列。
建议将时间列进行哈希,然后在哈希后的列上创建索引,如果有需求请使用钉钉联系表格存储技术支持。
- 由于会导致索引表水平扩展能力受限,影响索引表写入性能,不建议将取值范围非常小,甚至可枚举的列作为索引表主键的第一列,例如性别。
使用索引表时的注意事项如下:
- 在带有索引表的数据表中写入数据时需遵循如下规则,否则在数据表中写入数据会失败。
- 写入数据时,不能自定义数据的版本号。
- 批量写入数据时,一个批量写请求中,同一行数据(即主键相同)不能重复存在。