cassandra实战总结

1,关于第二索引(Secondary indexes):根据生产环境结果和实际测试,第二索引提取大量数据(大于10000)效率很差。实际使用第二索引查询,最好保证查询提取的数据小于5000。如何保证查询提取的数据小于5000是一个问题,因为limit是基于row的存放顺序,而不是基于查询条件,所以limit的结果往往丢失了应有的数据。另外,数据模型的设计决定了数据的查询能力,难以满足以后新的数据查询需求。

测试过程:

java version "1.6.0_37"

Java(TM) SE Runtime Environment (build 1.6.0_37-b06)

Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01, mixed mode)

全新的 ubuntu-12.04 LTS版本,apache-cassandra-1.1.6,默认配置,只建立一个keyspace,第一个CF(TestIndex),132000行测试数据,建立低维度索引(索引列tk只有3个值:A,B,X),秒表计时。

创建CF的CLI如下:

 

CREATE COLUMN FAMILY TestIndex
    WITH comparator = UTF8Type
    AND key_validation_class=UTF8Type
    AND default_validation_class = UTF8Type
    AND column_metadata = [
        {column_name: tk, validation_class: UTF8Type, index_type: KEYS}
        {column_name: from, validation_class: UTF8Type}
        {column_name: to, validation_class: UTF8Type}
        {column_name: tm, validation_class: UTF8Type}
    ];
 

 

使用CQL简单查询1,耗时约3秒。

 

1:select count(*) from TestIndex limit 1000000;

 

 使用CQL索引查询2,结果为130000,耗时约33秒。

 

 

2:select count(*) from TestIndex where tk='X' limit 1000000;

 

 

另外,使用高级API java hector查询,以及经过多次反复测试,结果一致。数据量对索引查询速度影响明显,随着数据量的增加,索引查询速度更慢,

 

2,关于JDK:官方推荐使用oracle JDK 1.6。以上测试,换用oracle最新的jdk1.7.0_09后,查询效率稍有改善:分别为2秒和22秒,第二索引查询时间还是普通查询10倍以上。

 

3,关于动态复合列(Dynamic Composite Column):动态复合列的查询效率与普通列查询效率相当。

测试过程:用前面的测试数据生成同样规模的动态复合列CF,使用tk,to,tm作为复合列名。

 

创建CF的CLI如下:

 

 

CREATE COLUMN FAMILY TestDc
    WITH comparator = 'DynamicCompositeType(s=>UTF8Type)'
    AND key_validation_class=UTF8Type
    AND default_validation_class = UTF8Type;

复合列的结构为:tk@to@tm--->from 

使用java hector查询测试:任意改变tk,to,tm的值组合查询,时间都在3秒左右。用CQL 3查询更直接。

 

另外,动态复合列的schema里面没有指定列名的组合方式。事实上,任意个属性组合的动态复合列可以插入同一个CF,但是查询时,只能按照最少属性数来查询,否则会有数组越界异常IndexOutOfBoundsException(java hector)。

动态复合列的排序:会按照复合属性的组合字符串进行排序,查询结果和普通列一样有序排列(cassandra的列天然有序放置,顺序取决于CF的comparator值)。

 

4,替代索引(alternate indexes):

参考文章

http://pkghosh.wordpress.com/2011/03/02/cassandra-secondary-index-patterns/

http://www.anuff.com/2010/07/secondary-indexes-in-cassandra.html

http://www.anuff.com/2011/02/indexing-in-cassandra.html。

 

5,数据的分布:

cassandra的数据分布与集群策略相关,但是都是按照行key进行分布,同一个行key的所有列数据,都放在同一个node。因此,即使行key的分布很均匀,但是每行的列数据量不均衡,各个服务器的数据量就会不均衡。

 

6.复合列的查询

(重要参考:http://www.datastax.com/dev/blog/introduction-to-composite-columns-part-1)

假设复合列结构:I1:I2:I3:C1:C2。复合列的SliceQuery查询行为只能对outer compoment进行范围查询,也就是说,只能对I3进行范围查询,I1,I2都必须是指定的一个值,不是通常理解的多条件查询(参考http://www.datastax.com/support-forums/topic/are-a-compositetype-column-queries-with-less_than_equal-component-equality-supported-in-hector ,zznate回复:“You can only add a non-equality component operation on the outer most component.To solve your use case with comparissons of both components, you would have to get all the columns resolved by the first criteria, component1<=arg1, then filter the rest on the client.")。复合列的查询详解将单独成文。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值