2017-04-12 43 views
3

我的表格介紹了子句工作:卡桑德拉cqlsh不與在非分區鍵

CREATE TABLE user (
    id text, 
    CustID int static, 
    UpdateDate date, 
    DateOfBirth date static, 
    Gender text static, 
    Address text static, 
    City text static, 
    State text static, 
    Zip text static, 
    Email text static, 
    Phone text static, 
    OverallAssets double, 
    PRIMARY KEY (id,UpdateDate) 
); 

SELECT * FROM用戶是工作的罰款。

select * from user where partition key is also fine fine。

但如果我把在where子句中得到以下error.What可以是因未分區鍵?

ReadFailure: Error from server: code=1300 [Replica(s) failed to execute 
read] message="Operation failed - received 0 responses and 1 failures" info= 
{'failures': 1, 'received_responses': 0, 'required_responses': 1, 
'consistency': 'ONE'} 
+0

這聽起來類似問題的方法:http://stackoverflow.com/questions/37114455/reading-error-in-cassandra –

+0

我增加了'tombstone_failure_threshold'值。仍然沒有工作。 – curiousguy

+0

你在日誌中看到什麼嗎?它仍然可能是墓碑(如果你有更多的話)。 –

回答

1

您正在使用allow filtering。小心。使用允許篩選執行此查詢可能不是一個好主意,因爲它可以使用大量計算資源,並且可能由於超時而不返回任何結果。不要使用允許生產篩選閱讀有關使用允許過濾的

https://docs.datastax.com/en/cql/3.3/cql/cql_reference/select_r.html?hl=allow,filter

而不是使用允許過濾創建物化視圖或索引datastax文檔。

檢查有關創建和使用這個鏈接物化視圖:https://www.datastax.com/dev/blog/new-in-cassandra-3-0-materialized-views

檢查有關創建和使用索引此鏈接:http://docs.datastax.com/en/cql/3.1/cql/cql_reference/create_index_r.html

當不使用索引
不要在這些情況下使用索引:

  • 在高基數列上,因爲您然後查詢大量記錄以獲得少量結果。請參閱下面的使用高基數列索引的問題。
  • 在使用計數器列的表中 在頻繁更新或刪除的列上。請參閱下面經常更新或刪除的列上使用索引時遇到的問題。
  • 查找大型分區中的行,除非查詢範圍很窄。除非在下面進行了細緻的查詢,否則請參閱使用索引查找大型分區中的行的問題。

來源:http://docs.datastax.com/en/cql/3.1/cql/ddl/ddl_when_use_index_c.html

2
select * from user where CustID =0 allow filtering; 

在卡桑德拉你需要採取基於查詢的建模方法。解決此問題的最佳方法是使用專門設計用於服務查詢的表

CREATE TABLE users_by_custid (
    id text, 
    CustID int, 
    UpdateDate date, 
    DateOfBirth date static, 
    Gender text static, 
    Address text static, 
    City text static, 
    State text static, 
    Zip text static, 
    Email text static, 
    Phone text static, 
    OverallAssets double, 
    PRIMARY KEY (cust_id,id,UpdateDate) 
); 

,將工作,它會散發不好,也不會要求陪ALLOW FILTERING全表掃描。

是我做cqlsh --connect-timeout=100000000 --request-timeout=10000000000

我無法就此發出警告反對這樣做就夠了。那些超時默認值存在是有原因的。由於執行不良的查詢,它們可以保護您的羣集/節點免於翻轉。當您遇到問題並試圖增加查詢超時時,請仔細查看您的查詢並查看是否有更好的方式來構建它。

+0

因此'cust_id'是我的'分區鍵'在這裏'id,UpdateDate'是集羣鍵正確嗎?現在我想知道如果我想查詢多個其他列的where子句,我應該將它們也作爲集羣鍵添加或更好地設計多個表來滿足這個目的。我正在考慮這裏的表現。 – curiousguy

+0

你會想要去多表路線。這是與Cassandra(或任何分佈式數據庫)之間的折衷。查詢靈活性總是難以實現。歸根結底,在使用不同數據存儲更合理之前,您希望保持同步多少個表。 – Aaron

+0

@curiousguy另一個想法:如果您使用Cassandra 3.x,則可以通過使用物化視圖或(在某些情況下)使用SASI索引來緩解某些查詢表開銷。如果您願意在讀取性能方面取得一些成效,那麼這些工具可以幫助提高查詢的靈活性。 – Aaron