「二級多列索引」是針對目標記錄的某個或某些列創建的「鍵-值」數據,以列的值爲鍵,以記錄的RowKey爲值,當以這些列爲條件進行查詢時,引擎能夠經過檢索相應的「鍵-值」數據快速找到目標記錄。華爲基於hbase開發的ctbase產品就提供了二級索引的實現,在建表時有兩個選擇,一個是把索引數據放在單獨一張表上,一個是把索引數據與原數據放在同一張表中,爲了能得到最佳的性能表現,通常是把索引數據與主數據放在一塊兒,本文也是以此爲例(索引數據放在單獨的表中只是數據位置不同,其它都同樣),經過在rowkey前增長數字前綴,使得索引數據老是存放在主數據後面。當全體數據按RowKey排序時,排在前面的都是主數據,咱們稱之爲主數據區,排在後面的均爲索引,咱們稱之爲索引區。性能
讓咱們經過一個示例來詳細瞭解一下二級多列索引表的結構,假定有一張客戶信息表(custom_info),以其中一個Region爲例,請看圖1,全部數據按RowKey進行字典排序,自動分紅了索引區和主數據區兩段,主數據區的Column Family是d,下轄v_cust_no, ci_name, ci_reg_birdy, ci_sex, ci_mbtelno, ci_addr等Qualifier,索引區的與主數據區在同一個Column Family,但單獨建了一個Qualifier名字爲i,這列只有rowkey,值都爲空。 接下來是最重要的部分,即索引和主數據的RowKey,咱們先看主數據的RowKey,它由數字0爲前綴(後面跟着一個分隔符」-「)和原始id(這邊是v_cust_no)組成。接下來看索引的RowKey,它的結構要相對複雜一些,格式爲:索引編號-索引鍵-索引值,圖中只展現了一個二級索引(實際上能夠有不少二級索引),這其中索引編號是指二級索引的編號,根據建立的順序進行編號,從1開始,因爲主數據的前綴爲0加分隔符,這樣就保證了索引數據必定放在主數據以後,接下來的索引鍵就是由組成這個索引的列值組成,這個例子中就是ci_name,最後的索引值就是對應的主數據的原始id了(主數據rowkey去掉前綴)。排序
如今,假設要查找用戶名(ci_name)爲張三的數據,ctbase的客戶端首先會根據它內部的一張元數據表(ctmeta)定位到該列對應的索引名及編號,這樣就將scan的區間收縮到[1-,2-),接着拼接查詢字段的值,咱們獲得了索引鍵:張三,scan區間又進一步收窄爲[1-張三,1-李四),因而咱們能夠很快地找到1-張三-39570341370020000002這條索引,進而獲得了索引值,也就是目標數據的RowKey:0^39570341370020000002,最後再經過Get操做獲得對應的主數據。索引