cassandra宽行列切片性能

时间:2013-07-01 06:47:15

标签: performance cassandra cql

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

  • 最重要的是,我可以做些什么来优化查询宽行(特别是此查询)?
  • 在单个请求情况下,这些数字是否反映了cassandra vs 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

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

解决方案是使用并发:单个客户端中的队列,线程和多个连接,或多个客户端。但是,如果你的用例不可能,我希望MySQL能够更快地进行这种读取。实际上,如果您只希望拥有31 MB的数据,那么MySQL可能更适合您的用例。