概述:
二级索引是phonix专用,用来用字段查询行,而hbase则是用rowkey来查询行
原因:
hbase通过rowkey查询的时候可以通过元数据中region的startkey与stopkey对比知道rowkey对应的数据在哪个region,region处于哪个regionserver。此时查询比较快。
hbase通过字段值来查询的时候,不能通过元数据知道数据处于哪个region中,所以需要全部扫描,此时效率比较低。此时可以通过二级索引提高查询效率

分类:
全局索引用于读多写少的场景,因为写的时候会改变两张表的结构(两张表在不同的region)然后产生跨节点的数据传输,
本地索引则用于写比较多的情况

原因:
hbase通过rowkey查询的时候可以通过元数据中region的startkey与stopkey对比知道rowkey对应的数据在哪个region,region处于哪个regionserver。此时查询比较快。
hbase通过字段值来查询的时候,不能通过元数据知道数据处于哪个region中,所以需要全部扫描,此时效率比较低。此时可以通过二级索引提高查询效率


全局二级索引

Global Index是默认的索引格式,创建全局索引时,会在HBase中建立一张新表。也就是说索引数据和数据表是存放在不同的表中的,因此全局索引适用于多读少写的业务场景。
写数据的时候会消耗大量开销,因为索引表也要更新,而索引表是分布在不同的数据节点上的,跨节点的数据传输带来了较大的性能消耗。
在读数据的时候Phoenix会选择索引表来降低查询消耗的时间。

1)创建单个字段的全局索引

CREATE INDEX my_index ON my_table (my_col);
image.png
如果想查询的字段不是索引字段的话索引表不会被使用,也就是说不会带来查询速度的提升。
image.png

2)创建携带其他字段的全局索引

CREATE INDEX my_index ON my_table (v1) INCLUDE (v2);
image.png
如果建的多个字段的组合索引,查询的时候必须带上组合索引第一个字段,而且必须和其他查询条件是and的关系,除此之外其他查询都是全表扫描

本地二级索引

Local Index适用于写操作频繁的场景。
image.png
索引数据和数据表的数据是存放在同一张表中(且是同一个Region),
避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销。查询的字段不是索引字段索引表也会被使用,这会带来查询速度的提升。
CREATE LOCAL INDEX my_index ON my_table (my_column);