4

我有一个带有二级索引的列族。二级索引基本上是一个二进制字段,但我使用的是字符串。名为is_exported的字段可以是'true''false'。请求后,所有加载的行都用is_exported = 'false'更新。

我每十分钟轮询一次该列表,并在新行出现时导出它们。

但这里的问题是:我看到这个查询的时间与列表中的数据量呈线性增长,目前需要12 到 20 秒(!!!)才能找到 5000 行。据我了解,索引请求不应取决于 CF 中的行数,而是取决于每个索引值(基数)的行数,因为它只是另一个隐藏的 CF,例如:

    "true" : rowKey1 rowKey2 rowKey3 ...
    "false": rowKey1 rowKey2 rowKey3 ...

我正在使用 Pycassa 来查询数据,这里是我正在使用的代码:

    column_family = pycassa.ColumnFamily(cassandra_pool, column_family_name, read_consistency_level=2)
    is_exported_expr = create_index_expression('is_exported', 'false')
    clause = create_index_clause([is_exported_expr], count = 5000)
    column_family.get_indexed_slices(clause)

我是不是做错了什么,但我希望这个操作能更快地工作。

有什么想法或建议吗?

一些配置信息:

  • 卡桑德拉 1.1.0
  • 随机分区器
  • 我有 2 个节点,replication_factor = 2(每台服务器都有一个完整的数据副本)
  • 使用 AWS EC2,大型实例
  • 临时驱动器上的软件 raid0

提前致谢!

4

1 回答 1

1

我不知道 Cassandra 中索引的内部结构,但我假设它的行为方式与 PostgreSQL / MySQL 类似,索引布尔值,真/假列在许多情况下是多余的。如果基数很低(true & false = 2 个唯一值)并且数据分布相当均匀,例如 ~50% true 和 ~50% false,那么数据库引擎可能会执行全表扫描(不使用索引)。

查询执行和数据集大小之间的线性关系将进一步支持 Cassandra 正在执行全表(键空间)扫描。

于 2012-08-28T19:02:24.997 回答