概述
全局索引是Phoenix的重要特性,合理的使用二級索引能降低查詢延時,讓集群資源得以充分利用。 本文將講述如何高效的設計和使用索引。
全局索引說明
全局索引的根本是通過單獨的HBase表來存儲數據表的索引數據。我們通過如下示例看索引數據和主表數據的關系。
當寫入數據到主表時,索引數據也會被同步到索引表中。索引表中的主鍵將會是索引列和數據表主鍵的組合值,include的列被存儲在索引表的普通列中,其目的是讓查詢更加高效,只需要查詢一次索引表就能夠拿到數據,而不用去回查主表。其過程入下圖:
Phoenix表就是HBase表,而HBase Rowkey都是通過二進制數據的字典序排列存儲,也就意味著Row key前綴匹配度越高就越容易排在一起。
全局索引設計
我們繼續使用DATA_TABLE作為示例表,創建如下組合索引。之前我們已經提到索引表中的Row key是字典序存儲的,什么樣的查詢適合這樣的索引結構呢?
CREATE INDEX B_C_D_IDX ON DATA_TABLE(B,C,D);
所有字段條件以=操作符為例:
注:上表查詢中and條件不一定要和索引組合字段順序一致,可以任意組合。
在實際使用中我們也只推薦使用1~4,遵循前綴匹配原則,避免觸發掃全表。5~7條件就要掃描全表數據才能過濾出來符合這些條件的數據,所以是極力不推薦的。
其它
? 對于order by字段或者group by字段仍然能夠使用二級索引字段來加速查詢。
? 盡量通過合理的設計數據表的主鍵規避建更多的索引表,因為索引表越多寫放大越嚴重。
? 使用了ROW_TIMESTAMP特性后不能使用全局索引
? 對索引表適當是的使用加鹽特性能提升查詢寫入性能,避免熱點。
本文作者:瑾謙
閱讀原文
本文為云棲社區原創內容,未經允許不得轉載。