2013-07-01 43 views
0

我正在測試一個vm上的cql/cassandra 1.2和python-cql庫與2GB ram。我有一個複合索引表(寬行)。在針對單個節點運行查詢時,我的性能比mysql低10倍左右。請求串行無併發性,但我對單個請求的速度感興趣。cassandra寬行列片性能

  • 最重要的是,有什麼我可以做的,以優化查詢寬行(特別是這個查詢)?
  • 這些數字是否反映了cassandra與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 

在此先感謝!

+0

你的專欄家有多大? nodetool cfstats'使用的空間(實時)'的輸出是最好的指標。 – Richard

+0

*用空間(實況):31749778 *使用(總)空間:31749778 *碾壓行最小尺寸:447 \t \t *碾壓行最大尺寸:654949 \t \t *碾壓行平均規模:68740 – user2537952

+0

這是31 MB,所以它很容易適應緩存。那麼它不能與記憶相關。這可能僅僅是因爲Cassandra的讀取延遲高於MySQL。吞吐量可能會更高,但您需要併發性。 – Richard

回答

0

您可以通過啓用行緩存來獲得更快的速度。將cassandra.yaml中的row_cache_size_in_mb設置爲大於CF大小的值 - 這樣就可以工作了。然後爲您的列族設置caching = 'all'。在您閱讀時,您應該看到nodetool info報告的命中率增加。

但是,我懷疑你會得到10倍加速的東西。

問題是Cassandra(特別是讀取)是爲高吞吐量而不是低延遲而構建的。 Cassandra內部有很多隊列會增加延遲。增加更多的節點將進一步增加延遲(但增加的節點數量遠遠超過複製因子不應增加延遲),但對吞吐量做出近似線性的改進。

解決方案是使用併發性:您的單個客戶端或多個客戶端中的隊列,線程和多個連接。但是如果這對你的用例來說是不可能的,我預計MySQL對於這種讀取​​會更快。事實上,如果你只希望擁有31 MB的數據,無論如何,MySQL可能更適合你的用例。

+0

嗨,感謝您的信息。生產數據將比這個數千倍大。這只是測試單個請求的延遲。 – user2537952