date: 2020-09-10 13:50:00
updated: 2020-09-14 16:30:00
全局索引:适合读多写少的场景。写数据时因为索引表分布在不同数据节点,跨节点数据传输带来巨大的性能消耗。
create index my_index on my_table (v3);
select v1 from my_table where v3 = '13406157616';
此时不会走索引,因为检索列不在全局索引中,有以下三种方法使它使用索引:
本地索引:适合读少写多的场景。在本地生成一个索引表。
覆盖索引:配合全局索引使用,避免回表查询。
函数索引:适合拼接式字符串查询?。
创建索引的时候有可能因为表的数据量过大,导致索引表的数据量过大,导致发生超时异常,创建出来的索引表不完整,此时可以通过异步索引创建来解决 -- 在创建索引的语句最后添加一个 async,执行语句会直接返回结果,但是索引表状态是处于building。
每一个put/delete操作执行前,会先写入到主表的 Write Ahead Log (WAL) 中,如果出现HBase服务器宕机,则可以从WAL中回放执行之前没有完成的操作,用来保证高并发、持久化的日志保存与回放机制。因为索引表的更新可能会落后于主表一小部分。
WAL日志文件使用的是Hadoop Sequence文件格式,其主要特点:
加盐的目的是为了让数据分散到不同机器,缓解查询压力
如果行键即数据,单调增加,那么数据会分布在一个region里,可能会造成热点问题 => 通过添加 SALT_BUCKETS = Num(0 -- 256) 来对行键添加一个字节,使得数据能更均匀分布到各个region中。
其中0是关闭对数据表添加了盐分的索引的盐析的一种特殊方式(因为默认情况下,索引与其数据表具有相同数量的盐桶)
由于加盐表不会顺序存储数据,因此严格的顺序扫描不会以自然排序的方式返回所有数据。强制进行顺序扫描的子句(例如带有LIMIT的子句)可能会返回与普通表不同的数据顺序。
new_row_key = (++index % BUCKETS_NUMBER) + original_key
通过关键字 !primarykeys table
或者下面这段查询
select
TENANT_ID TABLE_CAT,TABLE_SCHEM,TABLE_NAME ,COLUMN_NAME,KEY_SEQ,PK_NAME,CASE WHEN SORT_ORDER = 1 THEN 'D' ELSE 'A' END ASC_OR_DESC,ExternalSqlTypeId(DATA_TYPE) AS DATA_TYPE,SqlTypeName(DATA_TYPE) AS TYPE_NAME,COLUMN_SIZE,DATA_TYPE TYPE_ID,VIEW_CONSTANT from SYSTEM."CATALOG" "SYSTEM.TABLE" where
TABLE_SCHEM = 'MODEL_GROUP_RULE_ACCOUNT_TEST'
and TABLE_NAME = 'ECEJ_CALLING_CENTER_H'
and COLUMN_NAME is not null
and COLUMN_FAMILY is null
order by TENANT_ID,TABLE_SCHEM,TABLE_NAME ,COLUMN_NAME
当创建好phoenix的表后, 默认情况下phoenix不允许修改字段类型和长度。但是可以通过直接修改 SYSTEM.CATALOG 里的数据达到目的
upsert into SYSTEM.CATALOG (TENANT_ID,TABLE_SCHEM,TABLE_NAME,COLUMN_NAME,COLUMN_FAMILY,DATA_TYPE,COLUMN_SIZE) values('','库','表','字段','0',12,50);
测试发现,即使上面的上SQL执行成功,重新执行 upsert 往表里插入数据,DEBIT_AMOUNT(初始长度6)超过初始长度的还是不能成功
经过查看源码发现,在 SYSTEM.CATALOG
上有协处理器, 这个里面有表元数据缓存,默认要三个小时过期
org.apache.phoenix.cache.GlobalCache
long maxTTL = this.config.getLong("phoenix.coprocessor.maxMetaDataCacheTimeToLiveMs", 1800000L);
long maxSize = this.config.getLong("phoenix.coprocessor.maxMetaDataCacheSize", 20971520L);
猜想修改长度后三小时能生效
或者在hbase shell
中 先 disable SYSTEM.CATALOG
, 然后在 enable SYSTEM.CATALOG
手机扫一扫
移动阅读更方便
你可能感兴趣的文章