我正在用2GB内存在vm上测试cql/cassandra 1.2和python库。我有一张带有复合索引(宽行)的表。当对单个节点运行查询时,我的性能比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提前谢谢!
发布于 2013-07-01 15:25:35
通过启用行缓存,您可能会获得更快的速度。将row_cache_size_in_mb在cassandra.yaml中设置为比CF大小更大的东西,这样100就可以工作了。然后为列家族设置caching = 'all'。正如您所读到的,您应该看到nodetool info报告的命中率增加。
然而,我怀疑你会得到任何类似10倍的速度。
问题是,Cassandra (特别是reads)是为高吞吐量而不是低延迟构建的。卡桑德拉内部有许多队列,这增加了延迟。添加更多的节点将进一步增加延迟(但远远超出复制因子的节点数量的增加不应进一步增加延迟),而是对吞吐量进行了近似线性的改进。
解决方案是使用并发性:在单个客户端或多个客户端中使用队列、线程和多个连接。但是,如果在用例中这是不可能的,我希望MySQL在这种读取中会更快。实际上,如果您只期望拥有31 MB的数据,那么MySQL可能会更适合您的用例。
https://stackoverflow.com/questions/17398778
复制相似问题