全局索引

1. 功能介绍

全局索引顾名思义,就是TcaplusDB与索引系统之间是相互独立的,通过异步同步的方式,将TcaplusDB中的数据同步到索引系统;全局索引又叫分布式索引;

全局索引具有如下特点:

(1)全局索引是一个准实时索引系统,进行全局索引查询时,TcaplusDB表中新更新的数据无法实时查询出来,正常情况下,新更新的数据到能够通过索引查询出来的时延为秒级,大部分情况是1秒之内;

(2)建立了全局索引的字段,支持对这些字段进行范围查询,模糊查询以及聚合查询等;

(3)目前只支持对Generic表建立全局索引;

(4)只支持对表的一级字段(包括Key字段和Value字段)建立全局索引;

(5)只支持简单类型字段建立全局索引,简单类型包括:bool, enum, int8, uint8, int16, uint16, int32, uint32, int64, uint64, float, double, string(字符串);

(6)支持动态创建和修改全局索引,业务可以随时增加、删除或者修改全局索引,修改全局索引时,比如增加了一个索引字段,不会影响业务对修改前的全局索引查询;

TcaplusDB与全局索引之间的架构如下图所示:

2. 使用场景

当需要对某些一级字段进行范围查询,模糊查询或者聚合查询时,可以对这些字段建立全局索引。

比如一个用户表中,存在分数和等级两个一级字段,现在想实现如下需求:

查询分数大于给定值的用户,或者查询等级大于给定值的用户,或者同时满足分数大于给定值并且等级大于给定值的用户。

这个时候,就可以对分数和等级两个字段建立全局索引,再进行全局索引查询即可。

3. 使用指导

3.1. 创建索引

需要通过页面进行全局索引的创建,具体创建流程请参考 创建分布式索引(全局索引) 文档。

由于创建索引时,需要将历史数据同步到索引系统,因此耗时可能会较长,这里只有在创建索引的事务成功执行完成后,才能进行全局索引访问;

3.2. 修改索引

修改索引的入口跟创建索引的入口是一样的,请参考 3.1. 创建索引。

由于修改索引时,需要将历史数据同步到索引系统,因此耗时可能会较长,这里只有当修改索引事务成功执行完成后,才能对有修改的字段进行全局索引查询;

注意:修改索引执行过程中,不影响之前全局索引字段的访问,修改索引执行完成后,就只能对当前建立了全局索引的字段进行访问;

3.3. 删除索引

删除索引的入口跟创建索引的入口是一样的,请参考 3.1. 创建索引。

全局索引删除完成后,就无法再进行全局索引访问了。

3.4. 查询索引

TcaplusDB提供SQL查询语句进行全局索引查询,其中,SQL查询条件中的字段必须是建立了全局索引的字段,另外,如果是聚合查询,那么聚合查询的字段也必须是建立了全局索引的字段。

3.4.1. 全局索引查询接口

参见各SDK和API相关接口说明,TcaplusDB SDK & API

3.4.2. 支持的SQL查询语句

3.4.2.1. 条件查询

支持 =, >, >=, <, <=, !=, 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个字符。

3.4.2.2. 分页查询

支持limit offset分页查询,比如:

select * from table whre a > 100 limit 100 offset 0;

注意:当前limit必须与offset搭配使用,即不支持limit 1 或者 limit 0,1这种。

3.4.2.3. 聚合查询

当前支持的聚合查询包括: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。

3.4.2.4. 部分字段查询

支持查询部分字段的值,比如:

select a, b from table where a > 1000;

对于pb表,还支持查询嵌套字段的值,类似: select field1.field2.field3, a, b from table where a > 1000;

3.4.3. 不支持的SQL查询语句

3.4.3.1. 不支持聚合查询与非聚合查询混用
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;
3.4.3.2. 不支持order by查询
select * from table where a > 1000 order by a;
3.4.3.3. 不支持group by查询
select * from table where a > 1000 group by a;
3.4.3.4. 不支持having查询
select sum(a) from table where  a > 1000 group by a having sum(a) > 10000;
3.4.3.5. 不支持多表联合查询
select * from table1 where table1.a > 1000 and table1.a = table2.b;
3.4.3.6. 不支持嵌套select查询
select * from table where a > 1000 and b in (select b from table where b < 5000);
3.4.3.7. 不支持别名
select sum(a) as sum_a from table where a > 1000;
3.4.3.8. 不支持的其他查询

(1)不支持join查询。

(2)不支持union查询。

(3)不支持类似 select a+b from table where a > 1000 的查询。

(4)不支持类似 select * from table where a+b > 1000 的查询。

(5) 不支持类似 select * from table where a >= b 的查询。

(6)不支持其他未提到的查询。

4. 注意事项

(1)对于建立全局索引的表,要求表定义中的主键字段长度之和最好不要超过256字节,否则全局索引功能会异常。

(2)当满足查询条件的记录数过多时,会导致查询耗时较大(秒级或以上)。

(3)每次查询最多返回3000条记录,如果超过3000条,用户需要结合limit offset来多次查询,如果limit + offset大于10000并且满足查询条件的记录数的确大于10000时全局索引会直接报错,即全局索引对于同一个查询条件最多支持返回10000条记录。

(4)配置了数据淘汰的记录,到期后会同步删除全局索引系统中的数据。

results matching ""

    No results matching ""