2013-02-05 36 views
2

我有一些卡桑德拉相关的问题:使用Astyanax列出在卡桑德拉列族的所有行

我必须存储一些数据(约10M行)(比方说,一个自然的关键 - 排序,更新时间戳,CREATEDATE(YYYYMMDD 。只)和值字段我计划创建以下CF

CREATE TABLE data (
    id text, 
    createdate text, 
    updatedate timeuuid, 
    value text, 
    PRIMARY KEY (id, updatedate) 
); 

CREATE TABLE data_createdate (
    id text, 
    createdate text, 
    value text, 
    PRIMARY KEY (id, createdate) 
); 

我使用的查询将是这样的:

  • 得到所有行(ID,值,CREATEDATE,updatedate),所以CQL像这将做 SELECT * FROM data

我正在使用Astyanax,我该如何做分页?我一定要实现分区的顺序保存完好的,这样我就可以在一个范围值,通过使用token(id)页。

  • 得到一个updatedate范围内的所有行,所以CQL这样会做 SELECT * FROM data where updatedate > startdate and updatedate < enddate

同样,我该怎么做分页?

  • 获取具有已创建范围的所有行,它与上述问题类似,但我可以对data_createdate CF运行CQL。再次,我该如何做分页?

的任何建议和意见吗?非常感谢。

回答

1

一般你想避免任何需要循环访问一列系列的所有按键。就像在RDBM中一样,您只应该执行设置了适当索引的查询。

由于updatedate对于data表,你可以使用范围查询该列做传呼的复合行键的一部分(究竟是如何做到寻呼Cassandra是一个非常复杂的话题,可惜)。这意味着你的两个第一用例实际上是相同的。

我不确定第三种情况是什么意思,您的意思是您想查询data中的行,范围查询为createdate - 例如, SELECT * FROM data WHERE createdate > '20130206' AND createdate < '20130228'?我被你的第二个表(data_createdate),并在那里它。

适合如果你的意思,我认为你的意思是一个解决方案是一个二级指数增加的dataCREATE INDEX data_createdate_index ON data (createdate))的createdate列混淆。 You can read more about secondary indexing in the documentation