我们创建了具有以下架构的表:
创建表test_table(col_1文本,col_2文本,col_3文本,col_4文本,col_5文本,col_6文本,col_7文本,PRIMARY KEY(col_1,col_2,col_3,col_4,col_5));
此表包含近数十亿条记录。(巨大的记录数)
并尝试如下查询
从test_table中选择*,其中col_1 ='value'和col_2 ='value'; ->获得结果
但是当我们尝试如下所示时,
从test_table中选择*,其中col_1 ='value'和col_3 ='value'允许过滤; -> 未获得结果
从test_table中选择*,其中col_1 ='value'和col_4 ='value'允许过滤; -> 未获得结果
我们遇到以下错误:
“读取超时:来自服务器的错误:代码= 1200 [协调器节点超时,等待副本节点的响应] message =“操作超时-仅收到0个响应。” info = {'received_responses':0, 'required_responses':1,1,'consistency':'ONE'}“
出现上述错误后,我在cassandra.yaml配置文件中将超时参数从5秒延长到60分钟。
随后结果出来了,但是执行时间很长,执行时间为50分钟。
有人可以建议我在不扩展配置的情况下解决“ ReadTimeout:”问题吗?
答案 0 :(得分:0)
您的分区和群集键是什么?超时会导致数据大小太大,无法在给定的超时时间内处理。尝试查看分页和二级索引。 尽管二级索引可能会降低Wright的性能。
答案 1 :(得分:0)
通过使用“允许过滤”,您正在执行全表扫描,该扫描超时并且这就是您得到错误的原因。
您需要以一种无需运行“允许过滤”参数即可运行查询的方式来更改分区/集群键。
仅执行上述给定查询时,您可以考虑将数据复制到3个表中:
private func toVC<T>(_ id: String, vc: T.Type, data: Any) {
if let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: id) as? T {
if let window = self.window, let rootVC = window.rootViewController {
var currVC = rootVC
let navVC = UINavigationController()
while let presentVC = currVC.presentedViewController {
currVC = presentVC
}
(vc as? MyViewController1)?.data = data
(vc as? MyViewController2)?.data = data
navVC.viewControllers = [vc]
currVC.present(navVC, animated: true, completion: nil)
}
}
}
您的查询将是:
create table test_table_1(col_1 text, col_2 text, col_3 text, col_4 text, col_5 text, col_6 text, col_7 text, PRIMARY KEY (col_1, col_2));
create table test_table_2(col_1 text, col_2 text, col_3 text, col_4 text, col_5 text, col_6 text, col_7 text, PRIMARY KEY (col_1, col_3));
create table test_table_3(col_1 text, col_2 text, col_3 text, col_4 text, col_5 text, col_6 text, col_7 text, PRIMARY KEY (col_1, col_4));
记住: 在cassandra中,您可以围绕查询设计表。