Cassandra cqlsh 不适用于非分区键上的 where 子句



我的表格描述是:

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)
); 

从用户工作正常中选择 *。

从分区键也正常工作的用户中选择 *。

但是,如果我将非分区键放在 where 子句中,则会出现错误。可能是什么原因?

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'}
select * from user where CustID =0 allow filtering;

在Cassandra中,您需要采用基于查询的建模方法。 解决此问题的最佳方法是使用专门设计用于提供该查询的表。

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

我不能警告你不要这样做。 这些超时默认值的存在是有原因的。 它们可以保护您的集群/节点不会因查询性能不佳而翻倒。 当您遇到问题并试图增加查询超时时,请仔细查看您的查询,看看是否有更好的方法来构建它。

您正在使用allow filtering.小心。使用允许筛选执行此查询可能不是一个好主意,因为它可能会使用大量计算资源,并且由于超时可能不会返回任何结果。不要在生产中使用允许筛选 阅读有关使用允许筛选的datastax文档

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

不使用允许筛选创建实例化视图或索引。

查看有关创建和使用实例化视图的链接: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

最新更新