2010-09-23 22 views
4

我一直在使用mySQL作爲應用程序一段時間,而我收集的數據越多,得到的速度就越慢。所以我一直在研究NOSQL選項。我在mySQL中的一件事是從一堆連接創建的View。該應用程序顯示網格中的所有重要信息,用戶可以選擇範圍,執行搜索等。在此數據集上。標準查詢的東西。如何過濾Cassandra中的數據?

看着Cassandra,所有東西都已經根據我在storage-conf.xml中提供的參數進行了排序。所以我會在SuperColumn中使用特定的字符串作爲密鑰,並在下面的Columns中保留一堆數據。但是我只能按一列進行排序,而且我無法在列中進行任何真正的搜索,而無需拖動所有SuperColumn,並循環訪問數據,對不對?

我不想跨不同的ColumnFamilies重複數據,所以我想確保Cassandra適合我。在Facebook,Digg,Twitter中,他們有很多搜索功能,所以也許我只是沒有看到解決方案。

有沒有一種方法可以讓我在Cassandra中搜索或過濾SuperColumn或其關聯列中的特定數據值?如果沒有,是否有另一個NOSQL選項?

在下面的例子中,似乎我只能查詢phatduckk,friend1,John等。但是如果我想找到居住在城市的ColumnFamily中的任何人==「Beverley Hills」呢?可以在不返回所有記錄的情況下完成嗎?如果是這樣,我可以搜索城市==「貝弗利山」和狀態==「CA」?似乎我也無法做到,但我想確保看看我的選擇是什麼。

AddressBook = { // this is a ColumnFamily of type Super 
    phatduckk: { // this is the key to this row inside the Super CF 
    friend1: {street: "8th street", zip: "90210", city: "Beverley Hills", state: "CA"}, 
    John: {street: "Howard street", zip: "94404", city: "FC", state: "CA"}, 
    Kim: {street: "X street", zip: "87876", city: "Balls", state: "VA"}, 
    Tod: {street: "Jerry street", zip: "54556", city: "Cartoon", state: "CO"}, 
    Bob: {street: "Q Blvd", zip: "24252", city: "Nowhere", state: "MN"}, 
    }, // end row 
    ieure: {  
    joey: {street: "A ave", zip: "55485", city: "Hell", state: "NV"}, 
    William: {street: "Armpit Dr", zip: "93301", city: "Bakersfield", state: "CA"}, 
    }, 

}

回答

5

不能在卡桑德拉執行這些類型的操作。有一些選擇謂詞,它們可以在列鍵上設置,但它們不包含任何值。查看API並檢查get_slice/get_superslice和get_range查詢類型。再次,所有這些都涉及ColumnFamily或SuperColumnFamily中的鍵而不是值。

如果你想要你描述的那種功能,那麼你最好的選擇就是SQL數據庫。在你的表上建立適當的索引,尤其是在查詢最多的列上,你會發現查詢性能有很大的不同。希望這可以幫助。

+0

你能做到這些類型的操作與任何其他NOSQL類型設置?您如何看待像Facebook這樣的網站在他們的網站上使用Cassandra進行各種搜索/查詢?有多種方式來搜索數據。你認爲它在某些地方是重複的,並且只有多個ColumnFamilies允許以不同方式搜索數據? – Nathan 2010-09-23 14:48:22

+1

@Hallik:他們可能在不同家庭中複製數據,當然我不能確定。這是一個選擇;我在某個項目中使用Cassandra來跟蹤用戶的活動,組織等的活動,並且我創建了一堆用於提供/獲取相關更新的SuperColumnFamilies。我所需要做的就是執行查找。 – 2010-09-23 14:54:55

+1

也許我只是需要更努力地擺脫關係型數據庫的心態。我確信有一種最佳方式可以將我的數據從MySQL中移出,並在Cassandra的應用程序中獲得相同的功能。感謝您的輸入。 – Nathan 2010-09-23 15:03:30

6

你「不想跨越不同ColumnFamilies重複數據」,但這就是你在Cassandra中做這種查詢的方式。請參閱http://maxgrinev.com/2010/07/12/do-you-really-need-sql-to-do-it-all-in-cassandra/

+1

這可能是在卡桑德拉獲取數據的本質。如果您希望基於某個字段的查詢更好地使該字段成爲關鍵字!感謝您提供此鏈接。幫助我驗證了很多我最初覺得有疑問的設計決策:) – 2010-09-24 05:19:37

+0

是的,我越想越多,我意識到複製我想要查詢的數據就像創建我自己的索引一樣,不一定是壞事。我現在也在玩mongoDB,但我可能會退後一步。在接下來的幾周內進行大量測試。感謝那個鏈接,它確實幫了大忙! – Nathan 2010-09-24 13:36:04

0

超級家庭不支持二級索引,但常規的列家族不支持。使用二級索引可以使用GetWhere語句。

public function GetCodeWithValue($_value) 
{ 
    $result = $this->getDbFamily()->getWhere(array('value' => $_value, 'used' => 0)); 

    if ($this->IsValid($result)) 
     return $result->key(); 
    else 
     return null; 
} 

該代碼使用此卡珊德拉API:

這裏是我的PHP項目之一,採取一個例子https://github.com/kallaspriit/Cassandra-PHP-Client-Library˚F

0

注意,因爲有人問,卡桑德拉自動添加索引的支持由Cassandra系統管理(我認爲自0.8以來)。這可以回答一些人的問題,而不是管理自己的索引。

http://www.datastax.com/docs/1.1/dml/using_cli#indexing-a-column

這是說,我也想提到的是SQL數據庫,當創建索引,複製大量數據生成的說指數。在Cassandra中它仍然非常便宜,特別是因爲您可以對其進行高度優化。主要的問題是你必須手動保持SQL的一致性,而SQL會透明地爲你做。但是這兩種機制都使用完全相同的理論概念。

這是一個有點像重新編程自己的std :: string用,涉及到你的應用程序專長......(思考的QString和CString的。例如!)