【发布时间】:2013-07-01 23:25:35
【问题描述】:
我正在使用 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
提前致谢!
【问题讨论】:
-
您的列族有多大? nodetool cfstats 'space used (live)' 的输出是最好的指标。
-
*已用空间(实时):31749778 *已用空间(总计):31749778 *压缩行最小大小:447 *压缩行最大大小:654949 *压缩行平均大小:68740
-
这是 31 MB,因此很容易放入缓存中。那就不能和内存有关了。可能仅仅是因为 Cassandra 的读取延迟比 MySQL 高。虽然吞吐量可能更高,但您需要并发。
-
谢谢,我很担心 :( 我正在考虑操作 column_index_size_in_kb(当前设置为 64),但我不知道对我的用例有什么好的价值。
-
这不应该有任何区别,因为您正在读取一行的前 40 列。列索引仅在从大行中读取特定列时才有帮助。
标签: performance cassandra cql