当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 为什么Cassandra二级索引在350k行上如此之慢?

来源:互联网 收集:自由互联 发布时间:2021-06-22
我有一个带有二级索引的列族.二级索引基本上是一个二进制字段,但我正在使用一个字符串.名为is_exported的字段可以是“true”或“false”.请求后,所有加载的行都使用is_exported =’false’进
我有一个带有二级索引的列族.二级索引基本上是一个二进制字段,但我正在使用一个字符串.名为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
> RandomPartitioner
>我有2个节点,replication_factor = 2(每个服务器都有一个完整的数据副本)
>使用AWS EC2,大型实例
>临时驱动器上的软件raid0

提前致谢!

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

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

网友评论