2017-04-12 78 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