2012-05-31 51 views
6

我們想使用cassandra來存儲複雜數據
但我們無法弄清楚如何組織索引。Cassandra使用複合索引和二級一起

我們的表(列族)看起來是這樣的:

Users = 
    { 
    RandomId int, 
    Firstname varchar, 
    Lastname varchar, 
    Age int, 
    Country int, 
    ChildCount int 
    } 

我們有一個必填字段(名字,姓氏,年齡)和額外的搜索選項(國家,ChildCount)查詢。
我們應該如何組織索引來加快這種查詢的速度?

首先我想,在(Firstname,Lastname,Age)上創建複合索引並在剩餘字段(Country和ChildCount)上添加單獨的二級索引是很自然的。
但創建二級索引後我無法將行插入表中,我無法查詢表。

使用

  • 卡桑德拉1.1.0
  • cqlsh與--cql3選項。

歡迎任何其他建議來解決我們的問題(具有強制性和額外選項的複雜查詢)。

回答

2

這是我的想法。您可以簡單地創建一個列系列,將您的RandomId作爲行鍵,將所有其餘字段簡單地作爲列(例如,列名'firstname',列值'jonh')。之後,您必須爲每個這些列創建一個二級索引。你的價值的基數似乎很低,所以它應該稍微有效。

的CQL代碼應該是這樣的:

create column family users with comparator=UTF8Type and column_metadata=[{column_name: firstname, validation_class: UTF8Type,index_type: KEYS}, 
{column_name: lastname, validation_class: UTF8Type, index_type: KEYS}, 
{column_name: contry, validation_class: IntegerType, index_type: KEYS}, 
{column_name: age, validation_class: IntegerType, index_type: KEYS]}, 
{column_name: ChildCount, validation_class: IntegerType, index_type: KEYS]]; 

它一個很好的參考可能是http://www.datastax.com/docs/0.7/data_model/secondary_indexes

讓我知道,如果我錯了;

1

對於涉及大量分區的查詢,索引效率不高。

我認爲最好根據你想要的查詢來思考表格:你需要一個基於用戶名的查詢表,並且這似乎是存儲關於用戶的所有信息的正確位置。另一方面,您希望能夠基於國家進行搜索,我假設提供用戶列表:因爲您並不需要所有信息,可能只是名字或姓氏,或者只是電子郵件,等另一張桌子可以做到這一點。

這涉及一些數據重複,但更適合Cassandra數據建模思路。

這將使:

CREATE TABLE users(
    id UUID, 
    lastname TEXT, 
    firstname TEXT, 
    age INT, 
    country TEXT, 
    childcount INT, 
    PRIMARY KEY(UUID) 
); 

CREATE TABLE users_by_country(
    country TEXT, 
    firstname TEXT, 
    lastname TEXT, 
    user_uuid UUID, 
    PRIMARY KEY((country), firstname, lastname) 
); 

CREATE TABLE users_by_age(
    age INT, 
    firstname TEXT, 
    lastname TEXT, 
    user_uuid UUID, 
    PRIMARY KEY((age), firstname, lastname) 
); 
相關問題