【问题标题】:Why Cassandra secondary indexes are so slow on just 350k rows?为什么 Cassandra 二级索引仅在 350k 行上如此缓慢?
【发布时间】:2012-08-28 18:29:53
【问题描述】:

我有一个带有二级索引的列族。二级索引基本上是一个二进制字段,但我使用的是字符串。该字段名为 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

提前致谢!

【问题讨论】:

  • 你试过 1.2.x 吗?他们改进了二级索引支持。

标签: performance cassandra indexing pycassa


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答,但 Cassandra 是 NoSQL 存储,并且索引的构建方式与 RDBMS 中的二叉树非常不同。 Cassandra 的索引与所有其他列族一样建立在布隆过滤器上。我也有一个非常有偏见的基数,所以它总是 98-100% 的记录有“假”,只有 2% 的记录可以“真”值,我在每次导出迭代后将其更改为“假”。
  • 与 B-Trees 相比,我不确定在这种情况下布隆过滤器 + 哈希桶的性能会更高。但你是对的,检查“真”,其中“真”覆盖 2% 的数据集应该受益于索引扫描 - 但同样,由于数据集大小和查询时间之间的关系,我认为 Cassandra 正在做全扫描(它的“优化器”可能比已建立的 RDBMS 更原始)。另外,您是否尝试将字符串“true”|“false”更改为布尔原语?
猜你喜欢
  • 2019-10-08
  • 2013-12-04
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多