在Cassandra中,为什么要创建两个表供用户使用用户名和电子邮件进行搜索而不是添加索引?

时间:2017-07-27 16:18:22

标签: cassandra cql nosql

阅读本文:Basic Rules of Cassandra Data Modeling他们说,如果您希望能够通过电子邮件和用户名查询用户,您应该制作两个表:

CREATE TABLE users_by_username (
    username text PRIMARY KEY,
    email text,
    age int
)

CREATE TABLE users_by_email (
    email text PRIMARY KEY,
    username text,
    age int
)

你为什么要这样做?难道它不会使这些小东西的数据更难管理吗?你为什么不只做一个表并有一个索引?

-- A table holding the user info
CREATE TABLE users (
    username text,
    email text,
    age int,
    PRIMARY KEY((username),email)
);

-- An index that gives good performance on email searching
CREATE INDEX user_email ON users (email);

1 个答案:

答案 0 :(得分:2)

由于索引

中存在高基数问题,您应该制作两个表格
  

如果您在具有许多不同值的高基数列上创建索引,则字段之间的查询将导致许多搜索非常少的结果。在包含十亿封电子邮件的表格中,通过电子邮件查找用户(每个用户通常唯一的值)可能效率非常低。

当您使用电子邮件执行查询时,cassandra将在每个节点上执行此查询,每个节点将查找其本地索引并发送响应。您的合并结果将是单个用户。您正在查询每个节点以获得单个结果,效率非常低

相反,如果您通过电子邮件为用户创建单独的表。并且执行查询,cassandra只需要通过分区密钥电子邮件查找单个节点。

或者如果您使用的是cassandra 3.0或更高版本,则可以使用Materialized Views来自动维护您的非规范化。

来源:http://docs.datastax.com/en/cql/3.1/cql/ddl/ddl_when_use_index_c.html