本文主要对原生Tablestore查询、全局二级索引(Global Secondary Index)和多元索引(Search Index)三种查询场景进行详细分析。

详细分析参见Tablestore存储和索引引擎详解

原生Tablestore

数据查询依赖主键,主要是通过主键点查询(GetRow),主键范围查询(GetRange)。如需对属性列进行查询,需要使用Filter功能,在数据量很大的时候效率不高,甚至变成全表扫描。在实际业务中,主键查询也常常不能满足需求,而使用Filter在大数据量时效率很低。Tablestore推出了全局二级索引和多元索引,这两个功能弥补了原生Tablestore查询方式单一的缺点,本文主要为您分析全局二级索引以及多元索引的区别及选择。

全局二级索引

主表建立全局二级索引后,相当于多了一张Tablestore表,所以索引表的模型与Tablestore表一致。索引表相当于给主表提供了另外一种排序方式,即对查询条件预先设计了一种数据分布,加快数据查询的效率,索引表的查询方式仍然是基于主键点查、主键范围查、主键前缀范围查询。为了确保主键的唯一性,全局二级索引会将主表的主键列也放到索引表中。

多元索引

多元索引相比以上两种,底层增加了倒排索引,多维空间索引等,支持多字段自由组合查询、模糊查询、地理位置查询、全文检索等,相比功能较为单纯的二级索引更加丰富,而且一个索引可以满足多种维度的查询,支持多种查询条件,因此命名为多元索引。

索引选择

  • 不一定需要索引
    • 如果基于主键和主键范围查询的功能已经可以满足业务需求,那么不需要建立索引。
    • 如果对某个范围内进行筛选,范围内数据量不大或者查询频率不高,可以使用Filter,不需要建立索引。
    • 如果是某种复杂查询,执行频率较低,对延迟不敏感,可以考虑通过DLA(数据湖分析)服务访问Tablestore,使用SQL进行查询。
  • 全局索引or多元索引

    一个全局二级索引是一个索引表,类似于主表,其提供了另一种数据分布方式,或者认为是另一种主键排序方式。一个索引对应一种查询条件,预先将符合查询条件的数据排列在一起,查询效率很高。索引表可支撑的数据规模与主表相同,此外,全局二级索引的主键设计也同样需要考虑散列问题。

    一个多元索引是一系列数据结构的组合,其中的每一列都支持建立倒排索引等结构,查询时可以按照其中任意一列进行排序。一个多元索引可以支持多种查询条件,不需要对不同查询条件建立多个多元索引。相比全局二级索引,也支持多条件组合查询、模糊查询、全文索引、地理位置查询等。多元索引本质上是通过各种数据结构加快了数据的筛选过程,功能丰富,但在数据按照某种固定顺序读取这种场景上,效率不如全局二级索引。多元索引的查询效率与倒排链长度等因素相关,即查询性能与整个表的全量数据规模有关,在数据规模达到百亿行以上时,建议使用RoutingKey对数据进行分片,查询时也通过指定RoutingKey查询来减少查询涉及到的数据量。简而言之,查询灵活度和数据规模不可兼得。