通过使用多元索引(Search Index)的多种高效的索引结构,可以解决大数据的复杂查询难题。

解决什么问题

表格存储的数据表是一种典型的分布式NoSQL数据结构,可以高效地支持大规模数据的存储和读写场景,例如监控数据、日志数据等场景。

为了满足用户的按照非主键列查询,多列的自由组合查询等复杂查询需求,表格存储在支持单行读、范围读等主键查询的同时,创新性的推出了多元索引。

多元索引基于倒排索引和列式存储,可以解决大数据的复杂查询难题,包括非主键列查询、全文检索、前缀查询、模糊查询、多字段自由组合查询、嵌套查询、地理位置查询和统计聚合(max、min、count、sum、avg、distinct_count、group_by、percentiles和histogram)等功能。

索引区别

表格存储在支持数据表的主键查询的基础上,还提供了二级索引(Secondary Index)和多元索引两种加速查询的索引结构。下表展示了三种索引的区别。

索引类型原理场景
数据表主键数据表类似于一个巨大的Map,它的查询能力也就类似于Map,只能通过主键查询。适用于可以确定完整主键(Key)或主键前缀(Key prefix)的场景。
二级索引通过创建一张或多张索引表,使用索引表的主键列查询,相当于把数据表的主键查询能力扩展到了不同的列。适用于能提前确定待查询的列,待查询列数量较少,且可以确定完整主键或主键前缀的场景。
多元索引使用了倒排索引、BKD树、列存等结构,具备丰富的查询能力。适用于除数据表主键和二级索引之外的其他所有查询和分析场景:
  • 非主键列的条件查询
  • 任意列的自由组合查询
  • And、Or、Not等关系查询
  • 全文检索
  • 地理位置查询
  • 前缀查询
  • 模糊查询
  • 嵌套结构查询
  • Null值查询
  • 统计聚合(min、max、sum、avg、count、distinct_count、group_by、percentiles和histogram)

多元索引的使用方式不同于MySQL等传统数据库的索引使用方式,无最左匹配原则的限制,使用时非常灵活。一般情况下一张表只需要创建一个多元索引即可。例如有一个学生表,包括的列有姓名、学号、性别、年级、班级、家庭住址等,创建多元索引时,将这些列添加到同一个多元索引中即可。使用多元索引时,可以指定任意条件的组合查询,例如“姓名等于张三且年级为三年级的学生”、“家庭住址在附近1公里内且性别为男的学生”、“找出三年级二班住在某小区的学生”等。

说明 关于索引对比的更多信息,请参见TableStore索引功能详解

接口

多元索引目前提供通用查询接口(Search)和数据导出接口(ParallelScan)。

两种接口的功能大部分相同,但是ParallelScan接口为了提高某些方面的性能和吞吐能力舍弃了部分功能,详细信息请参见下表。
接口说明
Search全功能查询接口,支持多元索引的所有功能点。
  • 查询功能:非主键列查询、全文检索、前缀查询、模糊查询、多字段自由组合查询、嵌套查询、地理位置查询
  • 折叠(去重)
  • 排序
  • 统计聚合
  • 数据总行数
ComputeSplits+ParallelScan多并发数据导出接口,支持多元索引中的查询功能,不支持排序、统计聚合等分析功能。

相对于Search接口,ParallelScan可以提供更好的性能,单并发时性能(吞吐能力)是Search接口的5倍。

  • 查询功能:非主键列查询、全文检索、前缀查询、模糊查询、多字段自由组合查询、嵌套查询、地理位置查询
  • 单请求支持多并发查询

注意事项

重要 使用多元索引时,无需为数据表设置预定义列。
  • 索引同步

    用户为数据表创建了多元索引后,当在数据表中写入数据时,数据会先写入数据表中,数据写成功后会立即返回用户写成功,同时另一个异步线程会从数据表中读取写入的数据然后写入到多元索引,采用异步方式创建多元索引不会降低表格存储的写入能力。

    目前多元索引的延迟大部分在3秒以内,通过表格存储控制台可以实时查看多元索引创建的延迟情况。

  • 数据生命周期(TTL)
    • 如果数据表无UpdateRow更新写入操作,则您可以使用多元索引TTL。更多信息,请参见生命周期管理
    • 当只需要保留一段时间内的数据且时间字段不需要更新时,可以通过按时间分表的方法实现数据生命周期功能。

      按时间分表的原理、原则和优点如下:

      • 原理:按照固定时间,例如“日”、“周”、“月”或者“年”分表,并为每个表建立一个多元索引,根据需要保留所需时间的数据表。

        例如当数据需要保留6个月时,可以将每个月的数据保存在一张数据表中,例如table_1、table_2、table_3、table_4、table_5、table_6,并为每个数据表创建一个多元索引,每个数据表和多元索引中只会保存一个月的数据,只需要每个月把6个月前的数据表删除即可。

        当使用多元索引查询数据时,如果时间范围在某个表中,只需要查询对应表;如果时间范围在多个表中,需要对涉及的数据表均查询一次,再将查询结果合并。

      • 原则:单表(单索引)大小不超过500亿行,当单表(单索引)大小不超过200亿行时,多元索引的查询性能最好。
      • 优点:
        • 通过保留数据表的个数调节数据存储时长。
        • 查询性能和数据量成正比,分表后每个表的数据大小有上限,查询性能更好,避免查询延迟太大或者超时。
  • 数据多版本

    多元索引不支持数据多版本,即不能对设置了数据多版本的数据表创建多元索引。

    当在单版本中每次写入数据时自定义了timestamp,且先写入版本号较大的数据,后写入版本号较小的数据,此时先写入的版本号较大的数据可能会被后写入的版本号较小的数据覆盖。

    Search和ParallelScan请求的结果数据中不一定包括timestamp属性。

功能

多元索引可以解决大数据中复杂的查询问题,同时数据库、搜索引擎等其他系统也可以解决数据的查询问题。表格存储与数据库及搜索引擎等系统的主要区别如下。

除了Join、事务和相关性外,表格存储能覆盖数据库和搜索系统中的其他功能,同时具备数据库的数据高可靠性和搜索系统的高级查询能力,可以替换常见的数据库 + 搜索系统组合架构方式。如果您的使用场景中不需要Join、事务和相关性,您可以选择使用表格存储多元索引。

表格存储与数据库及搜索系统的主要的区别

计费

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