本地索引
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. 创建索引
定义本地索引之前,先了解一下本地索引字段与主键字段、分表因子的关系:分表因子必须是本地索引字段子集,本地索引字段必须是主键字段的真子集。以此保证本地索引中的数据落在同一个数据分片中;
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是没有限制记录数个数的。