本地索引

1. 功能介绍

本地索引顾名思义是对本地数据(每个数据分片的数据)建立的索引,本地索引在表定义文件随表一起定义,建表时随表一起创建。

本地索引具有如下特点:

(1)只支持对Key字段建立本地索引,并且本地索引的字段中还必须包含分表因子;

(2)本地索引请求中必须包含该索引的全部字段,并且这些字段均是等值查询,在满足这一条件的基础上,请求中还可以携带一个过滤条件;

(3)实时索引,当插入或者删除数据时,会同时更新索引数据;

(4)一个表可以建立多个本地索引,但是最多为8个本地索引;

(5)只有Generic表支持建立本地索引;

(6)一旦表创建后,就不能再增加、修改和删除本地索引了,删除表的时候,本地索引会一并删除;

2. 使用场景

当需要对部分Key字段进行等值查询时,就可以考虑使用本地索引;

2.1. 示例

有一个用户活动表,定义如下:

<struct name="UserActivityTable" version="1" primarykey="account,account_type,activity_id" splittablekey="account" >
    <entry name="account" type="uint64" desc="用户账户" />
    <entry name="account_type" type="string" size="64" desc="账号类型" />
    <entry name="activity_id" type="int32" desc="活动id" />
    <entry name="activity_info" type="ActivityInfo" desc="活动信息" />
    <index name="index1" column="account" />
    <index name="index2" column="account, account_type" />
</struct>

表中定义了如下两个本地索引:

(1)索引名称为:index1,索引字段为:account;

(2)索引名称为:index2,索引字段为:account, account_type;

那么,就可以实现进行如下查询:

(1)通过account来查询指定账户下参与的所有活动信息;

(2)通过account + account_type 来查询指定账户和账户类型下的所有活动信息;

3. 使用指导

3.1. 创建索引

定义本地索引之前,先了解一下本地索引字段与主键字段、分表因子的关系:分表因子必须是本地索引字段子集,本地索引字段必须是主键字段的真子集。以此保证本地索引中的数据落在同一个数据分片中;

具体如何在表中定义本地索引,请参考 TDR表PB表

3.2. 索引相关请求

3.2.1. 部分Key查询

(1)首先,必须包含某个本地索引的全部字段,并且给出这些字段的值,比如:

 定义了本地索引,包含字段为key1, key2,那么使用该索引进行部分key更新时,就必须把key1和key2的值给出来才可以;

 TcaplusDB会查询出所有满足key1=XXX and key2=XXX的记录;

(2)其次,在满足了(1)的基础上,请求中还可以携带一个过滤条件,用于对满足(1)的记录进行过滤,最终返回满足过滤条件的记录给用户,具体请参考 条件过滤和更新

另外,由于本地索引查询时,可能会返回非常多的数据,此时,TcaplusDB会进行分包返回的,如果业务侧收包速度低于TcaplusDB返回响应包的速度,那么就可能导TcaplusDB出现因为网络缓存区满而丢包的情况,一般建议是使用本地索引查询时,利用limit和offset的方式来分多次请求数据,特别是当数据量很大时;

部分Key查询接口请参见各SDK和API相关接口说明,TcaplusDB SDK & API

3.2.2. 部分Key更新

(1)首先,必须包含某个本地索引的全部字段,并且给出这些字段的值,比如:

 定义了本地索引,包含字段为key1, key2,那么使用该索引进行部分key更新时,就必须把key1和key2的值给出来才可以;

 TcaplusDB会将所有满足key1=XXX and key2=XXX的记录进行更新;

(2)其次,在满足了(1)的基础上,请求中还可以携带一个过滤条件,用于对满足(1)的记录进行过滤,最终将满足过滤条件的记录进行更新,具体请参考 条件过滤和更新

部分Key更新接口请参见各SDK和API相关接口说明,TcaplusDB SDK & API

3.2.3. 部分key删除

(1)首先,必须包含某个本地索引的全部字段,并且给出这些字段的值,比如:

 定义了本地索引,包含字段为key1, key2,那么使用该索引进行部分key删除时,就必须把key1和key2的值给出来才可以;

 TcaplusDB会将所有满足key1=XXX and key2=XXX的记录进行删除;

(2)其次,在满足了(1)的基础上,请求中还可以携带一个过滤条件,用于对满足(1)的记录进行过滤,最终将满足过滤条件的记录进行删除,具体请参考 条件过滤和更新

部分Key更新接口请参见各SDK和API相关接口说明,TcaplusDB SDK & API

4. 注意事项

假设本地索引包含的字段为key1, key2,如果出现key1=XXX and key2=XXX的记录数非常多时,当进行这个条件的本地索引查询时,就很容易出现性能问题,需要尽量避免,当然,目前TcaplusDB是没有限制记录数个数的。

results matching ""

    No results matching ""