【TcaplusDB知识库】TcaplusDB全局索引介绍
索引说明
TcaplusDB支持两种形式的索引:本地索引和全局索引。
-
本地索引:基于TcaplusDB主键字段建立的索引,在建表时随表一起建立。
-
全局索引:基于TcaplusDB表一级字段(包括主键字段和非主键字段)建立的索引。
通过本地索引和全局索引,用户可方便利用索引进行数据查询。优势:
-
基于本地索引查询,可以满足用户通过部分主键字段进行索引查询
-
基于全局索引,可以满足用户通过任意一级字段进行多种形式查询,如范围、模糊、聚合、分页等。
全局索引
介绍
全局索引,顾名思义,就是tcaplus与索引系统之间是相互独立的,通过异步同步的方式,将tcaplus中的数据同步到索引系统,因此,全局索引是一个准实时索引系统,即进行索引查询时,tcaplus表中新更新的数据无法实时查询出来,正常情况下,新更新的数据到能够通过索引查询出来的时延为秒级,大部分情况是1秒之内;
全局索引目前只支持对generic表建立索引,并且只支持表的一级字段(包括key字段和value字段)建立索引;并且也只支持简单类型建立索引,支持的类型包括:int8, uint8, int16, uint16, int32, uint32, int64, uint64, float, double, string(字符串); 对于pb表的bool和enum类型也支持,当pb表字段定义为string类型,如果该字段存储的是二进制,那么查询结果可能会不符合预期;对于uint64类型,如果值大于int64的最大值,查询结果将不符合预期,因此,如果该字段值会超过int64的最大值,建议不要为该字段建立索引;
tcaplus支持动态创建和修改索引,业务可以随时增加或删除或者修改全局索引,修改全局索引时,比如增加了一个索引字段,不会影响业务对修改前的全局索引查询;
tcaplus与全局索引之间的架构如下图所示:
创建
创建或者修改全局索引,需要在页面上进行申请,进入oms页面,点击 “业务管理” ---- > "表管理" ---- > 选择要创建全局索引的表,拉到最右侧,如下图:
点击 “索引”,进入到索引配置页面,在该页面勾上要建立索引的字段,然后点击“确认创建索引”按钮,这样就生成了创建全局索引的申请单,dba审核之后,会生成一个创建全局索引的事务,当事务执行成功后,该索引就可以被访问了。
数据同步
数据同步,是指tcaplus数据同步到索引系统,两者之间的数据是最终一致的,数据同步架构如下图所示:
索引查询
tcaplus提供sql查询语句进行索引查询,其中,sql查询条件中的字段必须是建立了全局索引的字段,另外,如果是聚合查询,那么聚合查询的字段也必须是建立了全局索引的字段;
一个索引查询请求,当前限制最多返回3000条记录;
支持的sql查询语句
条件查询
支持 =, >, >=, <, <=, !=, between, in, not in, like, not like, and, or , 比如:
select * from table where a > 100 and b < 1000;
select * from table where a between 1 and 100 and b < 1000;
select * from table where str like "test";
select * from table where a > 100 or b < 1000;
注意:between查询时,between a and b,对应的查询范围为[a, b],比如 between 1 and 100, 是会包含1和100这两个值的,即查询范围为[1,100]
注意:like查询是支持模糊匹配,其中"%"通配符,匹配0个或者多个字符; “_”通配符,匹配1个字符;
分页查询
支持limit offset分页查询,比如:
select * from table whre a > 100 limit 100 offset 0;
注意:当前limit必须与offset搭配使用,即不支持limit 1 或者 limit 0,1这种;
聚合查询
当前支持的聚合查询包括:sum, count, max, min, avg,比如:
select sum(a), count(*), max(a), min(a), avg(a) from table where a > 1000;
注意:聚合查询不支持limit offset,即limit offset 不生效;
注意:目前只有count支持distinct,即 select count(distinct(a)) from table where a > 1000; 其他情况均不支持distinct
部分字段查询
支持查询部分字段的值,比如:
select a, b from table where a > 1000;
对于pb表,还支持查询嵌套字段的值,类似:
select field1.field2.field3, a, b from table where a > 1000;
不支持的sql查询语句
不支持聚合查询与非聚合查询混用
select *, a, b from table where a > 1000;
select sum(a), a, b from table where a > 1000;
select count(*), * from table where a > 1000;
不支持order by查询
select * from table where a > 1000 order by a;
不支持group by查询
select * from table where a > 1000 group by a;
不支持having查询
select sum(a) from table where a > 1000 group by a having sum(a) > 10000;
不支持多表联合查询
select * from table1 where table1.a > 1000 and table1.a = table2.b;
不支持嵌套select查询
select * from table where a > 1000 and b in (select b from table where b < 5000);
不支持别名
select sum(a) as sum_a from table where a > 1000;
不支持的其他查询
-
不支持join查询;
-
不支持union查询;
-
不支持类似 select a+b from table where a > 1000 的查询;
-
不支持类似 select * from table where a+b > 1000 的查询;
-
不支持类似 select * from table where a >= b 的查询;
-
不支持其他未提到的查询。
索引查询流程
索引使用方式
tcaplus_client客户端工具
tcaplus_client工具支持全局索引查询,查询命令直接使用sql查询语句进行查询即可,使用help select 命令可以获取相关查询命令。注意tcaplusdb_client使用版本,目前最新的支持3.46.0。
C++ SDK
C++ SDK 已集成相关全局二级索引API,在示例代码中也有相关实现,具体请参考:
# C++ TDR SDK 全局二索引示例路径
TcaplusServiceApiXXX/release/x86_64/examples/tcaplus/C++_tdr1.0_syncmode_generic_simpletable/SingleOperation/globle_index_query
#C++ PB SDK全局全局索引示例路径TcaplusPbApiXXX/release/x86_64/examples/tcaplus/C++_pb2_coroutine_simpletable/SingleOperation/global_index_query