全局二级索引限制与约束
使用场景限制
- GSI不支持与HIndex(LSI)同时使用,即不支持在同一个数据表上同时创建本地索引与全局索引。
- 索引表不支持容灾。
- 不支持直接对索引表执行DISABLE、DROP、MODIFY和TRUNCATE操作。
- 索引DDL操作支持修改索引状态、删除索引、创建索引;不支持修改索引定义,如需修改,请先删除后重新创建。
- 已存在数据的表不能创建全局二级索引。
索引创建约束
- 索引名需要符合正则要求,不支持其他字符。正则要求支持的字符为:[a-zA-Z_0-9-.]:
- 数据表必须存在,要创建的索引不能已存在。
- 索引表不支持多版本。
- 单个数据表的索引个数不能超过5个。
不建议为单个数据表创建过多索引,索引数量过多会造成存储成本较高,写入耗时大。如果需创建超过5个索引,请在HMaster的自定义配置“hbase.hmaster.config.expandor”中新增参数“hbase.gsi.max.index.count.per.table”,设置值大于5,并重启HMaster使配置生效。
- 索引名长度不能超过18个字符。
不建议使用过长的索引名。如果需创建较长的索引名,请在HMaster的自定义配置“hbase.hmaster.config.expandor”中新增参数“hbase.gsi.max.index.name.length”,设置值大于18,并重启HMaster使配置生效。
- 不支持为索引表创建索引。
- 不支持创建可以被已有索引覆盖的索引。
新建索引时,如果之前已存在的索引能够完全覆盖新建的索引(即创建的索引是已有索引的子集),则无法创建此索引,重复功能的索引会造成存储浪费。例如,以下操作将无法创建索引2:
创建数据表:
create 't1','cf1'
创建索引1:
hbase org.apache.hadoop.hbase.hindex.global.mapreduce.GlobalTableIndexer -Dtablename.to.index='t1' -Dindexspecs.to.add='idx1=>cf1:[q1],[q2]'
创建索引2:
hbase org.apache.hadoop.hbase.hindex.global.mapreduce.GlobalTableIndexer -Dtablename.to.index='t1' -Dindexspecs.to.add='idx2=>cf1:[q1]'
- 不支持在同一张数据表上创建同名索引,支持在不同数据表上创建同名索引。
- 索引表列族TTL继承原表,索引列族TTL必须一致。
- 不支持自定义索引表其他属性。
索引写入约束
- 索引数据生成仅支持Put/Delete接口,使用其他方式(Increment、Append等)写入数据表时不会生成对应索引。
- 索引列数据定义为String类型时,要避免写入\x00和\x01两个特殊字符(特殊不可见字符)。
- 避免指定时间戳的方式写入索引列。
索引查询约束
- 索引查询时索引的状态必须为ACTIVE。
- 索引查询不支持指定时间戳范围查询。如果需要通过索引查询时间范围内的数据,请添加时间列存储该条数据时间戳,否则会使用数据表进行查询
- 索引查询仅支持SingleColumnValueFilter,使用其他Filter或无Filter条件时无法触发索引加速。