0

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

  • 最重要的是,我可以做些什么来优化查询宽行(特别是这个查询)?
  • 这些数字是否反映了单个请求情况下 cassandra 与 mysql 的性能?
  • 我有限的 ram/vm 能有这么大的不同吗?
  • 多节点 cassandra / 分区 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

提前致谢!

4

1 回答 1

0

通过启用行缓存,您可能会更快一点。在 cassandra.yaml 中设置row_cache_size_in_mb比你的 CF 大小更大的东西——所以 100 可以工作。然后caching = 'all'为您的列族设置。在您阅读时,您应该看到命中率增加,如nodetool info.

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

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

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

于 2013-07-01T15:25:35.377 回答