栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

6.1.12、Hbase

6.1.12、Hbase

二级索引:建立行键与列值的映射关系 1、二级索引

2、创建索引

(1)全局索引

全局索引适合读多写少的场景。如果使用全局索引,读数据基本不损耗性能,所有的性能损耗都来源于写数据。
数据表的添加、删除和修改都会更新相关的索引表(数据删除了,索引表中的数据也会删除;数据增加了,索引表的数据也会增加)

注意: 对于全局索引在默认情况下,在查询语句中检索的列如果不在索引表中,Phoenix不会使用索引表将,除非使用hint

创建全局索引:CREATE INDEX DIANXIN_INDEX ON DIANXIN ( end_date );
//索引表中row key 为end_date+原表row key
//查找的列在索引表中,就可以生效,查询 * 索引表就不能生效
索引的原理:就是scan+Filter形成前缀过滤器,索引快
创建一个/usr/local/soft/data
创建DIANXIN.sql文件shell脚本输入创建表语句
将数据上传在data下,可以使用Phoenix命令上传数据

CREATE TABLE IF NOT EXISTS DIANXIN (
     mdn VARCHAR ,
     start_date VARCHAR ,
     end_date VARCHAR ,
     county VARCHAR,
     x DOUBLE ,
     y  DOUBLE,
     bsid VARCHAR,
     grid_id  VARCHAR,
     biz_type VARCHAR, 
     event_type VARCHAR , 
     data_source VARCHAR ,
     ConSTRAINT PK PRIMARY KEY (mdn,start_date)
) column_encoded_bytes=0;

# 上传数据DIANXIN.csv

# 导入数据
psql.py master,node1,node2 DIANXIN.sql DIANXIN.csv	//在同一个文件下

# 创建全局索引
CREATE INDEX DIANXIN_INDEX ON DIANXIN ( end_date );	

# 查询数据 ( 索引未生效)	查全部列,索引不能生效
select * from DIANXIN where end_date = '20180503154014';

# 强制使用索引 (索引生效) hint
select   * from 
DIANXIN where end_date = '20180503154014';


# 取索引列,(索引生效)
select end_date from DIANXIN where end_date = '20180503154014';

# 创建多列索引
CREATE INDEX DIANXIN_INDEX1 ON DIANXIN ( end_date,COUNTY );

# 查询所有列 (索引未生效)
select  * from DIANXIN where end_date = '20180503154014'  and COUNTY = '8340104'

# 查询所有列 (索引生效)	//强制生效
select  * from DIANXIN where end_date = '20180503154014' and COUNTY = '8340104'

# 单条件  (索引未生效)	//因为row key是end_date+county+原row key,
//county在中间,索引不能生效
select end_date from DIANXIN where  COUNTY = '8340103';



select COUNTY from DIANXIN where end_date = '20180503154014';

# 删除索引
drop index DIANXIN_INDEX on DIANXIN;

(2)本地索引
本地索引适合写多读少的场景。和全局索引一样,Phoenix也会在查询的时候自动选择是否使用本地索引。本地索引因为索引数据和原数据存储在同一台机器上,避免网络数据传输的开销,所以更适合写多的场景。由于无法提前确定数据在哪个Region上,所以在读数据的时候,需要检查每个Region上的数据从而带来一些性能损耗。

注意:对于本地索引,查询中无论是否指定hint或者是查询的列是否都在索引表中,都会使用索引表,相当于之前的第二种将数据拿出来单独建一张表,row key改变

# 创建本地索引
CREATE LOCAL INDEX DIANXIN_LOCAL_IDEX ON DIANXIN(grid_id);

# 索引生效
select grid_id from dianxin where grid_id='117285031820040';

# 索引生效
select * from dianxin where grid_id='117285031820040';

(3)覆盖索引
覆盖索引是把原数据存储在索引数据表中,这样在查询时不需要再去Hbase的原表获取数据就,直接返回查询结果。
注意:查询是 select 的列和 where 的列都需要在索引中出现,
//与全局索引差不多,相当于x+y+county+原row key作为row key,表中加了一个列county

# 创建覆盖索引
CREATE INDEX DIANXIN_INDEX_COVER ON DIANXIN ( x,y ) INCLUDE ( county );	//在表中放入字段

# 查询所有列 (索引未生效)
select * from dianxin where x=117.288 and y =31.822;

# 强制使用索引 (索引生效)
select  * 
from dianxin where x=117.288 and y =31.822;

# 查询索引中的列 (索引生效) mdn是DIANXIN表的RowKey中的一部分
select x,y,county from dianxin where x=117.288 and y =31.822;

select mdn,x,y,county from dianxin where x=117.288 and y =31.822;
	//基于索引表就可以查询

# 查询条件必须放在索引中  select 中的列可以放在INCLUDE (将数据保存在索引中)
select  x,y,count(*) 
from dianxin group by x,y;
3、总结

(1)全局索引:----以设置的字段+原表数据row key作为索引表的row key
create index DIANXIN_INDEX on DIANXIN ( end_date );
全局索引只能查询row key中包含的字段,用前缀过滤,否则索引表不会生效,如果查询语句中的条件字段或返回字段不是索引字段,就会触发全表扫描。
解决办法有两个:
一是和覆盖索引一样,创建索引时把相关字段include进来。
二是强制使用索引,这样的查询语句会导致二次检索数据表,第一次检索是去索引表中查找符合索引字段的数据,这时候发现 * 字段并不在索引字段中,会去原表中第二次扫描,

因此只有当用户明确知道符合检索条件的数据较少的时候才适合使用,否则会造成全表扫描,对性能影响较大。

(2)覆盖索引:----以设置的字段+原表数据row key作为索引表的row key
create index DIANXIN_INDEX_COVER on DIANXIN ( x,y ) include ( county );
可以加入字段作为索引表的列(include …),查询条件放在索引中,select中的列可以放在include中
只需要通过索引就能返回所要查询的数据
(3)本地索引:region的start key+设置的字段+原表row key作为row key
create local index DIANXIN_LOCAL_IDEX on DIANXIN(grid_id);
即使查询的所有字段都不在索引字段中时也会用到索引进行查询(这是由Local Indexing自动完成的)(select *)

本地索引:
索引数据直接写在原表rowkey中,列族不写任何实际信息
索引数据以列族的形式存储在表中,在更新数据和更新索引时,只需要向数据所在的regionserver发请求即可!适合多写的场景!
索引row key是region的start key+设置的字段+原表row key(region start key目的是使索引数据和元数据在同一个region中),索引数据以列簇形式存在,查询时,根据条件查到索引row key,因为索引row key中包含了原row key,所以可以找到对应的原row key,找到对应的数据,所以这就是为什么select * 也会触发索引,都是需要找原数据的

而在读取数据时因无法提前判断索引数据的准确位置,则会在所有的 region 中检索索引数据,而非常影响读取性能
特点:即使查询数据中包含了非索引字段,也会走本地索引
本地索引可以创建成本地非前缀型,如果筛选条件中没有索引的字段就不走索引,只要包含了索引字段就可以走索引,因为它包含非前缀型,并不是以前缀来过滤的

全局索引:
索引以表的形式存储在hbase中,索引所在的region,也是由一个regionserver负责的!(单独一张表),可能在不同的regionserver上,索引写数据需要请求多个regionserver,IO开销大
如果表中的数据由102的rs负责,索引所在的region由103的rs负责!
在插入数据时,需要向102的rs发请求,还需要向103的rs发送写请求!
在多写少读的场景下,加重了rs的请求压力和网络负载!
适合的是多读的场景,读的话就是直接读取索引表,前缀过滤,很快,写的话很慢

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/335120.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号