【问题标题】:Cassandra; best practice regarding Indexes?卡桑德拉;关于索引的最佳实践?
【发布时间】:2013-12-29 15:05:15
【问题描述】:

我正在对 Cassandra 模式进行建模,以便对该主题更加熟悉,并且想知道创建索引的最佳做法是什么。

例如:

create table emailtogroup(email text, groupid int, primary key(email));
select * from emailtogroup where email='joop';
create index on emailtogroup(groupid);
select * from emailtogroup where groupid=2 ;

或者我可以创建一个全新的表:

create table grouptoemail(groupid int, email text,  primary key(groupid, email));
select * from grouptoemail where groupid=2;

他们都做这项工作。

我希望创建一个新表更快,因为现在 groupid 成为分区键。但我不确定创建索引时发生了什么“魔法”以及这种魔法是否有不利之处。

【问题讨论】:

    标签: java cassandra


    【解决方案1】:

    根据我的说法,您的第一种方法是正确的。

    create table emailtogroup(email text, groupid int, primary key(email));
    

    因为 1)在您的情况下,电子邮件是唯一的,是主键的良好候选者;2)多封电子邮件可以属于同一组,是二级索引的良好候选者。请参考这篇文章-Cassandra: choosing a Partition Key

    分区键用于在不同节点之间分配数据,如果您希望节点平衡(即在每个节点之间良好分布数据),那么您希望分区键尽可能随机。

    表创建的第二种形式对于范围扫描很有用。例如,如果您有像

    这样的用例

    i) 列出用户在 2010 年 1 月 1 日至 2013 年 1 月 1 日期间加入的所有电子邮件组。

    在这种情况下,您可能必须设计一个类似

    的表格
    create table grouptoemail(email text, ts timestamp, groupid int, primary key(email, ts));
    

    在这种情况下,用户加入的所有电子邮件组都将聚集在磁盘上。(一起存储在磁盘上)

    【讨论】:

    • 约翰很难让你的想法正确。如果我理解正确:分区键的唯一性,除非你想切片,否则分区键需要在一起。二级索引的唯一性低(低基数),导致高基数的索引没有多大意义。它开始陷入困境:-)
    【解决方案2】:

    这取决于 groupid 的基数。 cassandra docs

    何时不使用索引

    不要使用索引来查询大量记录 结果数。例如,如果您在一个 具有许多不同值的高基数列,查询 领域之间将招致许多寻求很少的结果。在里面 包含十亿用户的表,通过电子邮件地址查找用户(a 值通常对每个用户都是唯一的)而不是由他们的 状态,很可能是非常低效的。应该会更多 有效地将表手动维护为索引的一种形式 使用 Cassandra 内置索引。对于包含唯一的列 数据,有时在性能方面使用索引 方便,只要对具有查询量的表 索引列适中,不处于恒定负载。

    当然,不支持计数器列,其中每个 价值是不同的。

    相反,在基数极低的列上创建索引, 例如布尔列,没有意义。索引中的每个值 成为索引中的单行,导致所有 假值,例如。索引多个索引列 拥有 foo = true 和 foo = false 是没有用的。

    所以基本上,如果您要处理大型数据集,并且 groupid 不会返回很多行,那么二级索引可能不是最好的主意。

    DataStax Academy's Java Developement with Apache Cassandra class 的第 4 周讨论了如何有效地对这些问题进行建模。如果有机会,请检查一下。

    【讨论】:

    • 感谢布莱斯的澄清,它有点像普通的二级索引,只是有一点不同。明天我会检查给定的链接。
    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 2015-10-19
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多