索引是加速数据库查询的重要手段,Lindorm宽表除了提供高性能的二级索引外,同时支持全文索引(Search Index),主要面向复杂的多维查询场景,并能够覆盖模糊查询、聚合分析、排序、分页等场景。

简介

Lindorm宽表提供高性能的主键查询,如果业务方有非主键查询的需求,只能通过创建二级索引来满足,并且需要预先定义好索引列的顺序,一旦违背二级索引定义的顺序,将无法有效的完成查询。随着业务查询模型的增加,需要的二级索引也会越来越多,这将直接影响写入的吞吐,存储成本也会直线增加。基于倒排索引构建的Search Index有效的解决了这个问题,如果您有如下的需求,都可以直接创建Search Index使用:

  • 多维查询。给定多个列的随机组合,快速返回查询结果。
  • 聚合分析。提供group by能力,返回的结果按照指定列聚合输出。
  • 统计分析。提供基础的统计能力,可以对指定列输出统计结果。
  • 排序。提供order by能力,返回结果按照任意指定列排序。

适用场景

Search Index适用于需要保存海量数据,并且需要各种条件组合查询的业务。例如:物流订单场景。

整体数据流

Search Index是宽表引擎和搜索引擎深度融合后提供的新型索引,数据写入Lindorm宽表后,内置的LTS(原BDS)负责将数据实时同步到搜索引擎中。在此架构下,宽表引擎、数据同步通道LTS和搜索引擎都是以独立服务的方式存在,您可以分别对各个引擎进行管理:如果搜索引擎处理能力不足,只需要扩容搜索引擎;如果LTS同步能力不足,可以单独扩容LTS。宽表引擎/LTS/搜索引擎可以针对不同的使用场景选择不同的机型,独立的部署形态大幅提升了系统的稳定性。整体数据流如下图。

search_index1

与二级索引的区别

Lindorm提供高性能原生二级索引,可以低成本的解决非主键查询问题,适用于查询列比较固定的场景。如果业务场景需要复杂的多维组合查询,需要考虑使用Search Index。

宽表数据延时

宽表数据同步到搜索引擎会有延时,以下介绍延时时间计算。

总的延时时间 = 数据同步延迟 + 索引可见时间
  • 同步延迟:一般同步延迟在200ms以内,可横向扩展LTS来降低延迟。
  • 索引可见时间:默认索引可见时间为15s,最低可以设置为1s。设置的越小,可能会导致索引文件积压,影响查询性能。建议通过实际测试来设置合理的值。具体可参见索引数据可见性

开通全文索引

开通宽表引擎后,可以直接开通全文索引功能,实例会自动开通搜索引擎LTS(原BDS)

宽表开通搜索

使用指南

Search Index核心的体验如下:
  • 与二级索引体验类似,客户端不感知索引表的存在。
  • 业务只需要查询主表,服务端会自动编译优化为索引访问,并进行数据的汇总,统一返回给客户端。
  • 可同时支持上千个列的索引。
  • 写入表中的数据会自动同步到索引中去,同步延迟在200ms以内。

Search Index支持标准CQL访问,使用举例:

// 创建表
create table express_order (
    id varchar,
    expType varchar,
    opCode varchar,
    waybillNo varchar,
    inTime bigint,
    opTime bigint,
    constraint primary key(id));
// 创建search index,将expType, opCode, waybillNo, inTime, opTime设置为索引列
create search index mySearchIndex on express_order (expType, opCode, waybillNo, inTime, opTime);

// 写入数据
upsert into express_order(id,expType,opCode,waybillNo,inTime,opTime) values('1',  'a',  '110',  '37100',     1598343122833, 1598343068000);
upsert into express_order(id,expType,opCode,waybillNo,inTime,opTime) values('2',  'a',  '210',  '37100', 1598325151749, 1598325151000);
upsert into express_order(id,expType,opCode,waybillNo,inTime,opTime) values('3',  'a',  '310',  '37100', 1598325155596, 1598325155000);

// 查询数据
select * from express_order where id = '3';  -- 命中主表
select * from express_order opCode = '210' and opTime >= 1598325151000 and opTime <=  1598328751000 order by inTime; -- 命中search index: mySearchIndex
select * from express_order opCode = '310' and opTime >= 1598325151000 and opTime <=  1598328751000 order by inTime group by waybillNo; -- 命中search index: mySearchIndex
            
说明 CQL访问Search Index的详细使用可钉钉咨询专家服务