多元索引是表格存储产品中一个重要的功能,多元索引使用倒排索引技术为表格存储提供了非主键列上的快速检索功能,另外也提供了统计聚合功能。表格存储近期开放了SQL查询功能,SQL引擎默认从原始表格中读取数据,非主键列上的查询需要扫描全表。开启了多元索引之后,如果一个查询的过滤条件或者统计聚合可以下推至多元索引执行,那么SQL引擎将部分查询计划转换为多元索引请求,将从多元索引中获取数据,提高查询效率。
一 多元索引SQL算子支持
1 前提条件
在使用SQL查询多元索引之前,首先需要在表格上创建多元索引。如果多元索引包含SQL语句中涉及的数据列,则SQL引擎会通过多元索引读取数据并下推多元索引支持的算子。例如有一张表exampletable有a, b, c, d四列,多元索引中包含了b, c, d三列,只有当SQL语句中只涉及b, c, d中的数据列时,才会从多元索引读取数据。
- SELECT a, b, c, d FROM exampletable; /* 多元索引不包含a,b,c,d,扫描全表读取数据,不支持算子下推 */
- SELECT b, c, d FROM exampletable; /* 多元索引包含b,c,d,通过多元索引读取数据,支持算子下推 */
2 支持下推的算子
表格存储支持WHERE语句中的部分逻辑运算符和关系运算符下推,以及聚合函数和LIMIT算子下推。
二 多元索引SQL查询实战
为了直观地展示SQL查询多元索引功能,下文将以某自行车租赁商的订单表为例,使用多元索引上的SQL功能完成一些简单的查询分析任务。某自行车租赁商的订单表如下:
整张表格名为trips,每一笔租车订单都有唯一的订单号作为主键,订单中记录了租车时长、开始日期、结束日期、开始站点、结束站点等信息。表格中包含120万行数据,在没有开启多元索引的情况下对表格行数进行统计,查询会因为超出扫描配额限制而终止。
同样地,如果以非主键列作为查询条件进行查询,也会因为涉及全表扫描超过扫描配额而被终止。
为了能够根据非主键列的值进行查询以及统计聚合,需要创建覆盖全部数据列的多元索引。对于数据量比较大的表格,需要较长的时间等待多元索引同步完成。
1 过滤条件下推
在开启多元索引之后,即可在非主键列上进行条件查询。例如,下图查询起点编号31208到起点编号31209的租车订单,借助多元索引,SQL引擎能够在500毫秒之内查询到全表中满足条件的140行记录。
多元索引支持多个条件的组合,例如查询2010年10月1日当天,站点31208的订单。由于外国10月1日不放假,那天的订单数量并不是很多。
2 统计聚合下推
除了非主键列查询,多元索引还提供了强大的统计聚合能力。在未创建多元索引的时候无法统计行数,但是有了多元索引,能在500毫秒左右查询到行数、站点数、平均租车时长等信息。
同样地,分组统计聚合也可以快速获取结果,例如列出每个站点总订单数目。
过滤条件和统计聚合可以一起使用,例如查询2010年10月1日当天每个站点订单数目。
3 TopN下推
SQL中包含ORDER BY和LIMIT的语句成为TopN查询,多元索引支持快速查询TopN,图中的查询展示了最近的10条数据。