2012-08-28 67 views
4

我有一個具有二級索引的列族。二級索引基本上是一個二進制字段,但我使用了一個字符串。名爲的字段is_exported並且可以是'真''假'。請求後,所有加載的行都將更新爲is_exported ='false'爲什麼Cassandra二級索引在僅僅35萬行上非常緩慢?

我每十分鐘輪詢一次該列表,並在出現新的行時導出它們。

但是,這裏的問題是:我看到這個查詢的時間與列表中的數據量增長非常接近,目前需要從12秒到20秒(!!!)才能找到5000行。從我的理解,索引的要求不應該依賴於行數在CF而是從每一個索引值(基數)的行數,因爲它只是一個隱藏的CF,如:

"true" : rowKey1 rowKey2 rowKey3 ... 
    "false": rowKey1 rowKey2 rowKey3 ... 

我使用Pycassa查詢數據,這裏我正在使用的代碼:

column_family = pycassa.ColumnFamily(cassandra_pool, column_family_name, read_consistency_level=2) 
    is_exported_expr = create_index_expression('is_exported', 'false') 
    clause = create_index_clause([is_exported_expr], count = 5000) 
    column_family.get_indexed_slices(clause) 

我做錯了什麼,但我希望這個操作工作更快。

任何想法或建議嗎?

一些配置信息:

  • 卡桑德拉1.1.0
  • RandomPartitioner
  • 我有2個節點和replication_factor = 2(每個服務器都有一個完整的數據複製)
  • 使用AWS EC2,大實例
  • 臨時驅動器上的軟件raid0

提前致謝!

+0

你試過1.2.x嗎?他們已經改進了二級索引支持。 – Aaron

回答

1

我不知道在Cassandra中建立索引的內部結構,但我假設它的行爲與PostgreSQL/MySQL的行爲類似,索引布爾值,在許多情況下,真/假列是多餘的。如果基數較低(true & false = 2個唯一值)並且數據分佈相當均勻,例如, 〜50%爲真,〜50%爲假,那麼數據庫引擎可能會執行全表掃描(不利用索引)。

查詢執行和數據集大小之間的線性關係將進一步支持Cassandra正在執行全表(密鑰空間)掃描。

+0

感謝您的回答,但Cassandra是NoSQL存儲,索引的構建方式與RDBMS中的二叉樹完全不同。 Cassandra的索引建立在布隆過濾器上,與所有其他列系列一樣。我也有一個非常有偏見的基數,所以它總是98-100%的記錄具有「假」,只有2%的記錄可以是「真」值,在每次導出迭代後我都改爲「假」。 – bigdatarefiner

+0

與B樹相比,我不確定布隆過濾器+散列桶在這種情況下會更加高效。但是你是對的,檢查「真實」,其中「真實」覆蓋2%的數據集應該受益於索引掃描 - 但同樣,由於數據集大小和查詢時間之間的關係,我認爲卡桑德拉正在做一個全面掃描(其「優化器」可能比已建立的RDBMS更原始)。此外,你是否嘗試將字符串「true」|「false」更改爲布爾原語? –

相關問題