我有一个带有二级索引的列族.二级索引基本上是一个二进制字段,但我正在使用一个字符串.名为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正在执行完整表(键空间)扫描.