2013-07-01 49 views
0

我正在测试一个vm上的cql/cassandra 1.2和python-cql库与2GB ram。我有一个复合索引表(宽行)。在针对单个节点运行查询时,我的性能比mysql低10倍左右。请求串行无并发性,但我对单个请求的速度感兴趣。cassandra宽行列片性能

  • 最重要的是,有什么我可以做的,以优化查询宽行(特别是这个查询)?
  • 这些数字是否反映了cassandra与mysql在单个请求情况下的性能?
  • 难道我有限的ram/vm会使这个差异变大吗?
  • 多节点cassandra /分区mysql会比10x更接近吗?
  • 我在做可怕的错误吗?

测试代码:

""" 
CREATE TABLE foo_bars (
    foo_id text, 
    bar_id bigint, 
    content text, 
    PRIMARY KEY (foo_id, bar_id) 
) 
WITH CLUSTERING ORDER BY (bar_id DESC); 
""" 

#content is up to 64k text and te number of bar columns in a foo row will be ever growing but will probably never reach over 2million 


t1 = time.time() 
for i in range(1, 1000): 
    sql_query = "SELECT * FROM foo_bars WHERE foo_id IN(%s) ORDER BY id DESC LIMIT 40" % random_foo_ids 
    result = db_cursor.execute(sql_query) 
t2 = time.time() 
print "Sql time = %s" % str(t2 - t1) 


t1 = time.time() 
for i in range(1, 1000): 
    cql_query = "SELECT * FROM foo_bars WHERE foo_id IN(%s) LIMIT 40" % radom_foo_ids 
    result = cassandra_cursor.execute(cql_query) 
t2 = time.time() 
print "Cql time = %s" % str(t2 - t1) 

Sql time = 4.2 
Cql time = 58.7 

在此先感谢!

+0

你的专栏家有多大? nodetool cfstats'使用的空间(实时)'的输出是最好的指标。 – Richard

+0

*用空间(实况):31749778 *使用(总)空间:31749778 *碾压行最小尺寸:447 \t \t *碾压行最大尺寸:654949 \t \t *碾压行平均规模:68740 – user2537952

+0

这是31 MB,所以它很容易适应缓存。那么它不能与记忆相关。这可能仅仅是因为Cassandra的读取延迟高于MySQL。吞吐量可能会更高,但您需要并发性。 – Richard

回答

0

您可以通过启用行缓存来获得更快的速度。将cassandra.yaml中的row_cache_size_in_mb设置为大于CF大小的值 - 这样就可以工作了。然后为您的列族设置caching = 'all'。在您阅读时,您应该看到nodetool info报告的命中率增加。

但是,我怀疑你会得到10倍加速的东西。

问题是Cassandra(特别是读取)是为高吞吐量而不是低延迟而构建的。 Cassandra内部有很多队列会增加延迟。增加更多的节点将进一步增加延迟(但增加的节点数量远远超过复制因子不应增加延迟),但对吞吐量做出近似线性的改进。

解决方案是使用并发性:您的单个客户端或多个客户端中的队列,线程和多个连接。但是如果这对你的用例来说是不可能的,我预计MySQL对于这种读取​​会更快。事实上,如果你只希望拥有31 MB的数据,无论如何,MySQL可能更适合你的用例。

+0

嗨,感谢您的信息。生产数据将比这个数千倍大。这只是测试单个请求的延迟。 – user2537952