Cassandra复合键查询

时间:2014-08-06 17:46:55

标签: cassandra

这更像是一个设计问题。

我们假设我有这个表(为了便于阅读,省略了大多数列):

CREATE TABLE IF NOT EXISTS users (
userid uuid,
emailaddress text,
passwordhash text,
passwordsalt text,
datecreated timestamp,
PRIMARY KEY (userid, emailaddress)
);

在此表中,我有时需要通过emailaddress获取userid,有时只需使用userid获取其余值,因此查询为:

  1. emailaddress搜索,获取userid并在其他地方使用
  2. userid搜索,获取特定用户的所有值,并在其他地方使用。
  3. 仅查询userid,因为它是复合键表中的第一个键,但是由emailaddress查询(事先不知道用户ID),我将不得不打开{{1}这是强烈气馁的。

    问题是:知道这个设计在Cassandra如何运作方面不是很好,我还能如何实现我的目标(通过EITHER ALLOW FILTERINGuserid获取用户详细信息)?我应该创建两个这样的表吗?

    emailaddress

    还是有更清洁的方式来实现我想做的事情?我提前道歉,因为我对卡桑德拉的来龙去脉不了解。我还在学习它并试图从正确的角度处理问题而不是黑客攻击(CREATE TABLE IF NOT EXISTS users ( userid uuid, passwordhash text, passwordsalt text, datecreated timestamp, PRIMARY KEY (userid) ); CREATE TABLE IF NOT EXISTS useremails ( emailaddress text, userid uuid, PRIMARY KEY (emailaddress) ); 允许我这样做。)

    非常感谢,

2 个答案:

答案 0 :(得分:2)

Cassandra将数据存储在分区中,主键定义中的第一个键是分区键。您希望查询命中一个(或至少n个)分区,而不是进行群集范围搜索(允许过滤允许)。

你有第二张桌子的想法很好。我会顺其自然。请记住,两个1ms查询优于一个2s查询:)

答案 1 :(得分:1)

如果您期望用户数量非常大,那么您自己选择使用索引管理第二个表是一个不错的选择。如果预期的用户数量稍低(约10-50万),您也可以使用二级索引。这些选项在Cassandra 1.1 documentation中讨论。既然你似乎在使用Cassandra 2.0,你可能也希望看一下Cassandra 2.0 documentation

  

何时使用辅助索引

     

Cassandra的内置二级索引在列族中最佳   有许多行包含索引值。越独特   特定列中存在的值,您将产生更多的开销   平均来说,查询和维护索引。例如,   假设您有一个拥有十亿用户的用户表并希望查看   他们所居住的州的用户数量很多。很多用户都会分享相同的用户   状态的列值(例如CA,NY,TX等)。这将是一个   二级指数的良好候选人。

     

何时不使用二级索引

     

不要使用二级索引来查询大量的记录   少数结果。例如,如果在列上创建索引   如果有许多不同的值,则会产生字段之间的查询   许多人寻求的结果很少。在列族中有十亿   用户,通过他们的电子邮件地址查找用户(值为   对于每个用户而言通常是唯一的,而不是由他们的状态,很可能   效率很低。它可能会更有效率   手动维护动态列族作为索引的形式   而不是使用二级索引。对于包含唯一的列   数据,使用二级索引有时性能很好   为方便起见,只要查询卷到索引列即可   家庭温和,不受持续负荷。

     

构建和使用辅助索引

     

二级指标的一个优点是操作简便性   填充和维护索引。辅助索引是内置的   自动背景,不阻止读取或写入。   必须手动创建客户端维护的列族作为索引;   例如,如果通过创建列来索引状态列   像users_by_state这样的家庭,你的客户端应用程序必须这样做   使用来自用户列族的数据填充列族。

正如您所看到的,您有两个选项,如果表的预期大小相当小,则使用二级索引使其立即运行而不必更改太多代码,或者如果应用程序使用2表设置如果太大或者你希望它在未来扩展到那个水平。

始终尽量避免使用ALLOW FILTERING,

希望它有所帮助!