Phoenix二級索引使用

JPblog

  JPblog 發佈於 2018/08/28 16:06 

Apache HBasePhoenix

衝擊年薪50W,助你進階Python工程師>>> 

1.添加二級索引配置

    爲使用Phoenix二級索引,需要開啓HBase regionServer相關參數配置

<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>

    用戶可直接在CM中的HBase配置頁,搜索hbase-site.xml配置相關參數(保存並重啓服務即可)

2.全局索引

    全局索引適用於讀多寫少的場景,它會建立一張獨立的HBase索引表,對原始數據侵入性小。所有對數據表的寫操作都會引起索引表的更新(DELETE、UPSERT VALUES和UPSERT SELECT))。索引表分佈在不同的數據節點上的,跨節點的數據傳輸帶來了較大的性能消耗。如果查詢列不在索引表中,默認索引表將不會被使用,除非使用hint(SELECT /*+ INDEX(table_name,index_name) */ …)。

#建立全局索引
CREATE INDEX IDX_PARENTID ON TMP_STAFF(parentid);
#使全局地索引
SELECT hrid FROM TMP_STAFF WHERE parentid = 1927;
#強制使用全局索引
SELECT /*+ INDEX(TMP_STAFF, IDX_PARENTID) */ hrid,departmentid 
  FROM TMP_STAFF WHERE parentid = 1927;

    Phoenix中創建索引並查看索引表數據

    hbase shell中查看索引表數據

3.本地索引

    本地索引適用於寫多、讀少、空間有限的場景。與全局索引一樣,Phoenix將自動選擇是否在查詢時使用本地索引。索引數據和原表數據存放在相同的服務器中,防止寫入期間出現任何網絡開銷。即使查詢的字段不是索引字段,本地索引也會被使用。與全局索引不同,4.8.0之前版本,表的所有本地索引都存儲在單獨共享表中;從4.8.0開始,本地索引數據存儲在同一個數據表中單獨的影子列族中。在使用本地索引進行讀取時,因爲不能預先確定索引數據確切的region位置,因此必須檢查每個region的數據。這會給讀取時帶來一些額外開銷。

#建立本地索引
CREATE LOCAL INDEX IDX_LOCAL_PARENTID ON TMP_STAFF(parentid);
#使用本地索引
SELECT * FROM TMP_STAFF WHERE parentid = 1927;

    Phoenix中創建索引並查看索引表數據

    hbase shell中查看索引表數據

4.覆蓋索引

    覆蓋索引的特點是我們可以把關心的列打包存儲在索引表中,一旦在索引表中能夠找到索引條目就不需要返回主表,直接拿到查詢結果。

#建立覆蓋索引
CREATE INDEX IDX_COVER_PARENTID on TMP_STAFF(parentid) include(departmentid);
#使用覆蓋索引
SELECT departmentid FROM TMP_STAFF WHERE parentid = 1782 ;

5.函數索引

    函數索引的特點是能根據表達式創建索引,適用於對查詢表過濾條件是表達式的表創建索引。

#創建函數索引
CREATE INDEX IDX_FUNC_DEPARTMENTID ON TMP_STAFF (UPPER(departmentid));
#使用函數索引
SELECT * FROM TEST WHERE UPPER(departmentid)='HOTEL';

6.執行計劃與性能

    1> 創建索引並查看執行計劃,發現進行了索引局部掃描RANG SCAN OVER IDX_DEPARTMENTID

#創建全局索引
CREATE INDEX IDX_DEPARTMENTID ON TMP_STAFF(departmentid);
#查看執行計劃
explain select count(*) from TMP_STAFF where departmentid='hotel';

    有索引情況下用時0.023S

    2> 刪除索引並查看執行計劃,發現進行了全局掃描FULL SCAN OVER TMP_STAFF

#刪除全局索引
DROP INDEX IDX_DEPARTMENTID ON TMP_STAFF;
#查看執行計劃
explain select count(*) from TMP_STAFF where departmentid='hotel';

    無索引情況下用時0.046

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章