【问题标题】:Compound Indexes in Apache CassandraApache Cassandra 中的复合索引
【发布时间】:2011-06-01 06:59:40
【问题描述】:

我正在尝试在读取数据时需要过滤的几列上设置具有二级索引的 cassandra 列族。在我最初的测试中,当我同时使用多个索引时,事情会变慢。这是我目前的配置方式(通过 cassandra-cli):

update column family bulkdata with comparator=UTF8Type and column_metadata=[{column_name: test_field, validation_class: UTF8Type}, {column_name: create_date, validation_class: LongType, index_type: KEYS}, {column_name: domain, validation_class: UTF8Type, index_type: KEYS}];

我想获取 create_date > somevalue1 和 column_name = somevalue2 的所有数据。为我的客户使用 pycassa,我执行以下操作:

  domain_expr = create_index_expression('domain', 'whatever.com')
  cd_expr = create_index_expression('create_date', 1293650000, GT)
  clause = create_index_clause([domain_expr, cd_expr], count=10000)
  for key, item in col_fam.get_indexed_slices(clause):
    ...

这当然是 SQL 中的一个常见错误,通常必须根据查询需要创建复合索引。不过,我对 cassandra 还是很陌生,所以我不知道这样的事情是否需要甚至存在。

我与 cassandra 的交互将包括大量写入、大量读取和更新。我已经设置了索引,认为它们在这里是正确的,但也许我完全错了。无论是否设置索引,我都会对设置高性能系统的任何想法感兴趣。

哦,这是在 cassandra 0.7.0-rc3 上

【问题讨论】:

  • 子句越多,查询时间越长,在合理范围内是正常的。你能提供更多细节吗?你插入了多少行?您查询的列中的值分布如何?
  • 目前,这些值都是一个范围内的随机数据。到目前为止,我的测试大约有 100 万行。对于列中的数据,create_date 是随机的,因此所有值都在同一年内,domain 是从 8 个列表中随机抽取的域名,test_field 是随机字符。

标签: cassandra indexing


【解决方案1】:

原生 Cassandra 二级索引有一些限制。根据 datastax 文档,它们不应该用于具有高基数(唯一值太多)的列。您正在索引的 create_date 列似乎具有高基数。此外,原生 Cassandra 索引支持中没有复合索引之类的东西。

如需更深入的报道,您可以访问我的博文 http://pkghosh.wordpress.com/2011/03/02/cassandra-secondary-index-patterns/

普拉纳布

【讨论】:

    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2018-04-11
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多