我在2GB ram的vm上测试cql / cassandra 1.2和python-cql库。我有一个复合索引(宽行)的表。当针对单个节点运行查询时,我的性能比mysql差10倍。请求是串行的,没有并发性,但我对单个请求的速度感兴趣。
测试代码:
"""
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 :(得分:0)
通过启用行缓存,您可以更快地获得它。将cassandra.yaml中的row_cache_size_in_mb
设置为大于CF大小的值 - 这样100就可以了。然后为列系列设置caching = 'all'
。在您阅读时,您应该会看到nodetool info
报告的命中率增加。
然而,我怀疑你会得到10倍加速的东西。
问题在于Cassandra(特别是读取)是为高吞吐量而不是低延迟而构建的。 Cassandra内部有很多队列会增加延迟。添加更多节点将进一步增加延迟(但是,远远超出复制因子的节点数量的增加不应该进一步增加延迟),但是对吞吐量进行近似线性的改进。
解决方案是使用并发:单个客户端中的队列,线程和多个连接,或多个客户端。但是,如果你的用例不可能,我希望MySQL能够更快地进行这种读取。实际上,如果您只希望拥有31 MB的数据,那么MySQL可能更适合您的用例。