我再三听到,二级索引(在cassandra中)仅是为了方便,而不是为了提高性能。建议您在基数较低时(例如,性别column
具有两个男性或女性值)使用二级索引的唯一情况
考虑这个例子:
CREATE TABLE users (
userID uuid,
firstname text,
lastname text,
state text,
zip int,
PRIMARY KEY (userID)
);
现在,除非在
users
的firstname index
上创建二级索引,否则我无法执行此查询select * from users where firstname='john'
我如何对该表进行非规范化,以便可以进行以下查询:
这是使用复合键的唯一有效方法吗?
还有其他选择或建议吗?
CREATE TABLE users (
userID uuid,
firstname text,
lastname text,
state text,
zip int,
PRIMARY KEY (firstname,userID)
);
最佳答案
为了提供一个好的数据模型,您需要首先确定要执行的所有查询。如果您只需要按用户的名字(或名字和用户ID)查找用户,那么您的第二种设计就可以了...
如果还需要通过用户的姓氏查找用户,则可以创建另一个具有相同字段但主键为(lastname,userID)的表。显然,您将需要同时更新两个表。数据复制在Cassandra中很好。
但是,如果您担心两个或多个表所需的空间,则可以创建一个按用户ID划分的单个用户表,以及要通过以下方式查询的字段的其他表:
CREATE TABLE users (
userID uuid,
firstname text,
lastname text,
state text,
zip int,
PRIMARY KEY (userID)
);
CREATE TABLE users_by_firstname (
firstname text,
userid uuid,
PRIMARY KEY (firstname, userid)
);
该解决方案的缺点是您将需要两个查询来按用户名检索用户:
SELECT userid FROM users_by_firstname WHERE firstname = 'Joe';
SELECT * FROM users WHERE userid IN (...);
希望这可以帮助
关于cql3 - 如何避免 Cassandra 二级索引?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25124993/