2010-09-23 20 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的。例如!)