用一個ColumnFamily來儲存資料,用一個或者多個ColumnFamily來為這些資料提供索引服務,是一個常見的資料存放區策略。
索引策略主要依賴需要被索引的資料。記住,索引中的每一行都儲存在單一的節點上,所以當一個單行索引被大量使用的時候,這個節點的負載會比平均負載大一些。以下為一些常見使用的索引策略。
一對一
這種情況對應於關聯式資料庫的唯一索引,被索引的值不存在重複,每一個被索引的值都對應於一條記錄,可以使用Cassandra的寬表方式來儲存索引資訊,ColumnFamily的一行資料表示一個索引,每一個列的名稱表示被索引的值,每一個列的值表示被索引資料所對應的Row Key。
索引特徵:
一個被索引的值匹配一個資料行Key;
每個索引是一個單獨的行,該行的每一列為被索引的資料行;
索引的行Key是你要使用的索引的名稱;
索引的列名是被索引的值;
索引的列值是被索引的行key;
使用案例:
存在一個會員列表Users(user_id、name、email、addresss),每一行表示一條會員資訊,其中存在一個User_ID列表示該會員的數字ID,具有唯一性。由於業務需要根據User_ID來尋找使用者資訊,所以可以給User_ID建一個唯一索引。
在Cassandra中建立一個ColumnFamily,UNIQUE_INDEX
TableName: UNIQUE_INDEX |
Row Key |
INDEX_USERS_USER_ID |
ColumnName |
10000055 |
1000898 |
4562221 |
Value |
USERS_ROW_KEY1 |
USERS_ROW_KEY2 |
USERS_ROW_KEY2 |
一個對幾個
這種情況對應於關聯式資料庫的普通索引,同樣的值允許重複,但是重複的次數不會太多,並且對於重複值的讀取存在一定的集合性。與前述的唯一索引類似,在索引的ColumnFamily中,依然是一個行對應於一個索引,行Key即為索引名稱,不一樣的地方在於Column是使用Super Column,對於被索引的值對應得多條記錄,則分別用SuperColumn中的Sub Column來加以區別,超列名稱為被索引的值,子列名稱為索引值所對應的多條記錄的Row Key,子列的值不需要儲存任何資訊。
索引特徵:
一個被索引的值匹配幾個行Key;
每個索引是一個單獨的行,每個索引的值是一個超列;
索引的行Key是你要使用的索引的名稱;
索引的超列名稱是被索引的值;
索引的超列中的子列名稱是被索引的行key;
超列中的子列沒有值;
一個對多個
這種情況對應於關聯式資料庫的位元影像索引,被索引的值具有一定的枚舉性,每一個被索引的值都對應著成千上萬的記錄資訊。我們常見的有對於狀態的索引,比如Users表有一個欄位,Status(1 初始化 2 待審核 3 審核通過 4 審核不通過 5 作廢),業務需要根據狀態來查詢使用者資訊,則需要在Status上建立索引資訊。對於每一個這樣的索引欄位,都需要使用一個專有的Column Family儲存,對於行Key,則為被索引的值,對於列名則為被索引的值所對應的及記錄的Row Key。
索引特徵:
一個被索引的值匹配許多行Key;
每一個被索引的值只接受它自己的行;
每一個索引的行Key匹配被索引的行的列值;
列名稱可以是:
行Key,在沒有排序要求的情況下;
用於去排序Key的值;列值包含行keys;
每一個被索引的列名使用一個column family;