本文通过对原生Tablestore查询、二级索引(Secondary Index)和多元索引(Search Index)三种查询场景进行详细分析,为您提供索引的选择建议。
背景信息
表格存储的数据查询依赖主键,主要是通过主键点查询(GetRow)和主键范围查询(GetRange)。如需对属性列进行查询,需要使用Filter功能,在数据量很大的时候效率不高,甚至变成全表扫描。更多信息,请参见读取数据。
在实际业务中,主键查询也常常不能满足需求,而使用Filter在大数据量时效率很低。Tablestore推出了二级索引和多元索引两个功能来弥补原生Tablestore查询方式单一的缺点。
索引介绍
表格存储提供了二级索引和多元索引用于加速数据查询。
二级索引
为数据表创建二级索引后,相当于多了一张Tablestore表,所以索引表的模型与Tablestore表一致。索引表相当于给数据表提供了另外一种排序方式,即对查询条件预先设计了一种数据分布,加快数据查询的效率。更多信息,请参见二级索引简介。
索引表的查询方式仍然是基于主键点查、主键范围查、主键前缀范围查询。为了确保主键的唯一性,表格存储会将数据表的主键列自动补齐到索引表中。
表格存储提供了全局二级索引和本地二级索引两种类型的索引。全局二级索引以异步方式将数据表中被索引的列和主键列的数据自动同步到索引表中,正常情况下同步延迟达到毫秒级别。
为了满足用户的强一致性查询等需求,表格存储推出了本地二级索引。本地二级索引以同步方式将数据表中被索引的列和主键列的数据自动同步到索引表中,当数据写入数据表后,即可从索引表中查询到数据。
全局二级索引和本地二级索引在同步方式、对第一列主键要求、同步延迟和读取一致性方面的区别请参见下表说明。
维度 | 全局二级索引 | 本地二级索引 |
同步方式 | 异步方式 | 同步方式 |
第一列主键要求 | 可选数据表中的任意主键列或者预定义列 | 必须和数据表的第一列主键相同 |
同步延迟 | 毫秒级别 | 实时 |
读取一致性 | 最终一致性 | 强一致性 |
多元索引
多元索引相比数据表主键查询和二级索引,底层增加了倒排索引、多维空间索引等,支持多字段自由组合查询、模糊查询、地理位置查询、全文检索等。更多信息,请参见多元索引简介。
多元索引的功能比二级索引更加丰富,而且一个多元索引可以满足多种维度的查询,支持多种查询条件,因此命名为多元索引。
索引选择
根据查询条件确定是否需要使用索引。
一般情况下,以下查询场景无需使用索引。
如果确定要使用索引,请根据实际查询场景选择二级索引或者多元索引。
二级索引:一个二级索引是一个索引表,类似于数据表,其提供了另一种数据分布方式或者认为是另一种主键排序方式。一个索引对应一种查询条件,预先将符合查询条件的数据排列在一起,查询效率很高。索引表可支撑的数据规模与数据表相同,此外,二级索引的主键设计也同样需要考虑散列问题。
多元索引:一个多元索引是一系列数据结构的组合,其中的每一列都支持建立倒排索引等结构。查询数据时可以按照其中任意一列进行排序。一个多元索引可以支持多种查询条件,不需要对不同查询条件建立多个多元索引。
相比二级索引,多元索引还支持多条件组合查询、模糊查询、全文索引、地理位置查询等。多元索引本质上是通过各种数据结构加快了数据的筛选过程,功能丰富,但在数据按照某种固定顺序读取的场景上效率不如二级索引。多元索引的查询效率与倒排链长度等因素相关,即查询性能与整个表的全量数据规模有关,在数据规模达到百亿行以上时,建议使用路由键(RoutingKey)对数据进行分片,查询数据时通过指定RoutingKey查询来减少查询涉及到的数据量。