cassandra - 当我们提供所有分区键时,ALLOW FILTERING 是如何工作的?
问题描述
我已经阅读了至少 50 篇关于此的文章,但仍然不知道答案......我知道分区、集群和 ALLOW FILTERING 是如何工作的,但无法弄清楚将 ALLOW FILTERING 与所有分区键一起使用的情况是什么在查询中提供。
我有一张这样的桌子:
CREATE TABLE IF NOT EXISTS keyspace.events (
date_string varchar,
starting_timestamp bigint,
event_name varchar,
sport_id varchar
PRIMARY KEY ((date_string), starting_timestamp, id)
);
像这样的查询是如何工作的?
SELECT * FROM keyspace.events
WHERE
date_string IN ('', '', '') AND
starting_timestamp < '' AND
sport_id = 1 /* not in partitioning nor clustering key */
ALLOW FILTERING;
'sport_id' 过滤是否对通过正确定义的键较早检索的记录进行?在这种查询中仍然不鼓励 ALLOW FILTERING 吗?
在这种特殊情况下我应该如何执行过滤?
提前致谢
解决方案
是的,它应该首先过滤掉分区,然后只对非键值进行过滤,并按照这里提到的实验:https ://dzone.com/articles/apache-cassandra-and-allow-filtering I在大多数情况下,认为在所有键之后使用允许过滤是安全的。
这在很大程度上取决于您要过滤掉多少数据 - 如果 sport_id = 1 的最后一个条件试图过滤掉大部分数据,那么这将是一个坏主意,因为它会给数据库带来很大压力,所以你需要考虑这里的权衡。
将 IN 子句与分区键一起使用不是一个好主意——尤其是上面的查询看起来不太好,因为它同时使用了分区键上的 IN 子句和允许过滤。
建议 - Cassandra 非常擅长在一秒钟内处理尽可能多的请求,设计理念应该是一次发送更多更轻量级的查询,而不是尝试发送一个需要大量工作的查询。所以我的建议是在不过滤最后一列的情况下,在分区键上使用 = 条件对 Cassandra 进行 N 次调用,然后在代码中组合并进行最终过滤(无论您使用哪种语言,我都认为它可以支持并行发送所有这些调用到数据库)。通过这样做,您将在数据增长时获得长期的性能优势。
推荐阅读
- javascript - 如何使用 react-dropzone-uploader 将图像数据上传到 API 并从该 API 取回结果图像?
- node.js - 有没有办法将依赖 Axios 调用重构为 JSON api?
- python - 创建一个计算器python
- raspberry-pi - 在启动时启动 python 脚本
- c# - 我想将类型为“160”的字符串显示为格式为“16.0”的浮点数
- android - 如何在 android 上模拟 NFC 标签?
- javascript - 在 Lit-Html 中发布请求
- forms - 注册用户并让用户使用 Typo3 登录
- javascript - 如何发布 JS 谷歌登录表单的“用户名”?
- cassandra - Cassandra 3.11,nodetool重建失败