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