这更像是一个设计问题。
我们假设我有这个表(为了便于阅读,省略了大多数列):
CREATE TABLE IF NOT EXISTS users (
userid uuid,
emailaddress text,
passwordhash text,
passwordsalt text,
datecreated timestamp,
PRIMARY KEY (userid, emailaddress)
);
在此表中,我有时需要通过emailaddress获取userid,有时只需使用userid获取其余值,因此查询为:
emailaddress
搜索,获取userid
并在其他地方使用userid
搜索,获取特定用户的所有值,并在其他地方使用。仅查询userid
,因为它是复合键表中的第一个键,但是由emailaddress
查询(事先不知道用户ID),我将不得不打开{{1}这是强烈气馁的。
问题是:知道这个设计在Cassandra如何运作方面不是很好,我还能如何实现我的目标(通过EITHER ALLOW FILTERING
或userid
获取用户详细信息)?我应该创建两个这样的表吗?
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)
);
允许我这样做。)
非常感谢,
答案 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,
希望它有所帮助!