为啥 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 范围内进行查询。 我预计表 PLOTPLOT_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&lt;RowKey, SortedMap&lt;ColumnKey, ColumnValue&gt;&gt; 有一个类比,因此行存储在 map 中,集群列是 SortedMap&lt;ColumnKey, ColumnValue&gt;。有了这些,我仍然可以合理地获取任何给定 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 响应获取

Cassandra Spark 写入缓慢

为啥我从数据库中获取数据缓慢?

为啥 Symfony 2 在我的环境中响应非常缓慢?

为啥 Grid 的 TapGesture 识别器在 UWP 的情况下响应缓慢,但在 Android 和 iOS 中运行良好?

DCE Cassandra 3.9 在加入现有集群期间创建二级索引缓慢