为啥 Cassandra 在获取数据时响应缓慢而不是拆分到不同的范围查询?
Posted
技术标签:
【中文标题】为啥 Cassandra 在获取数据时响应缓慢而不是拆分到不同的范围查询?【英文标题】:Why Cassandra respond slowly on fetching data than splitting to different range queries?为什么 Cassandra 在获取数据时响应缓慢而不是拆分到不同的范围查询? 【发布时间】:2014-11-16 12:11:23 【问题描述】:我正在设计一个 cassandra 列族,如下所示
CREATE TABLE PLOT
(
PLOT_ID text,
INDEX_VALUE double,
VALUE_1 double,
VALUE_2 double,
VALUE_3 double,
PRIMARY KEY(PLOT_ID,INDEX_VALUE));
该设计使我也可以在 INDEX_VALUE 范围内进行查询。 我预计表 PLOT 中 PLOT_ID 的最大数量为 2700000。INDEX_VALUE 对于每个 PLOT_ID 将在 0-30000 .
在大多数情况下,我需要一次与 PLOT_ID 相关的所有数据。 所以我正在使用这样的查询。
SELECT INDEX_VALUE,VALUE_1,VALUE_2,VALUE_3 FROM PLOT WHERE PLOT_ID='p01';
但它需要一些时间。 所以我拆分查询如下所示。
SELECT INDEX_VALUE,VALUE_1,VALUE_2,VALUE_3 FROM PLOT WHERE PLOT_ID='p01' and INDEX_VALUE <=1000 and INDEX_VALUE >=0;
SELECT INDEX_VALUE,VALUE_1,VALUE_2,VALUE_3 FROM PLOT WHERE PLOT_ID='p01' and INDEX_VALUE <=2000 and INDEX_VALUE >=1001;
....
....
....
SELECT INDEX_VALUE,VALUE_1,VALUE_2,VALUE_3 WHERE PLOT_ID='p01' and INDEX_VALUE <=30000 and INDEX_VALUE >=29001;
而且它的响应速度相当快。 可能是什么问题? 我的 cassandra 只有一个节点。 这是由于 cassandra 配置造成的吗? 对我的设计有什么建议吗?
【问题讨论】:
【参考方案1】:配置不是一个因素,而是 Cassandra 的工作方式。使用默认的 Murmur3Partitioner(推荐),按复合主键 PLOT_ID 分区键查询,检索由 (PLOT_ID INDEX_VALUE) 存储的所有行。当您在查询中包含 INDEX_VALUE 时,Cassandra 检索的数据较少,所以我认为这解释了为什么查询不需要这么长时间。在过去几年中,由于复合主键使用的聚类列等改进,Cassandra 不再遍历给定行的所有列来检查哪一列与范围匹配。数据基于聚类列连续存储,可以高效检索。
【讨论】:
我正在努力理解您的答案,但还是不明白。将where PLOT_ID = 12
子句放在分区键上,它应该只返回该行中的所有数据,不是吗?据我了解,在INDEX_VALUE
上添加一个范围应该会使查询变慢,因为它需要遍历给定行的所有列并检查哪个列匹配范围。
抱歉不清楚。希望这次编辑能改进解释。
表中PLOT_ID和INDEX_VALUE的组合唯一标识一行。
我仍然有疑问:-)。你能看看here 吗?与 Java Map<RowKey, SortedMap<ColumnKey, ColumnValue>>
有一个类比,因此行存储在 map 中,集群列是 SortedMap<ColumnKey, ColumnValue>
。有了这些,我仍然可以合理地获取任何给定 RowKey 的所有数据(在本例中为 PLOT_ID
),并且比将查询拆分为更小的范围查询更有效。
可能有一种更有效的方法来为您的查询建模以获得您想要的东西,但是 eBay 博客已经过时了。不再使用超级列。 2012 年春季 (datastax.com/dev/blog/whats-new-in-cql-3-0),宣布了第一个重大变化。 CQL 3.0 与以前的 CQL 版本的最大区别之一是 WHERE 子句可以包括对除第一个以外的列的大于/小于比较。如果您使用的是现代版本的 Cassandra,datastax.com/documentation/cql/3.1/cql/cql_intro_c.html 是更好的信息来源。以上是关于为啥 Cassandra 在获取数据时响应缓慢而不是拆分到不同的范围查询?的主要内容,如果未能解决你的问题,请参考以下文章
连接 Cassandra NoSQL DB 并将响应作为 JSON 响应获取
为啥 Grid 的 TapGesture 识别器在 UWP 的情况下响应缓慢,但在 Android 和 iOS 中运行良好?