【问题标题】:Cassandra queries performance, rangesCassandra 查询性能、范围
【发布时间】:2015-08-18 00:02:06
【问题描述】:

我是 Cassandra 的新手,我想知道如果使用“date = '2015-01-01'”或“date >= '2015-01-”询问查询是否会对性能产生任何影响01' AND 日期

我想使用这样的范围的唯一原因是因为我需要进行多个查询并且我想让它们准备好(就像在准备好的语句中一样)。这样准备好的语句数量就减少了一半。

我要使用的两个表中使用的键是 ((key1, key2), date) 和 (key1, date, key2)。第一个表的查询类似于:

SELECT * FROM table1
WHERE key1 = val1
    AND key2 = val2
    AND date >= date1 AND date <= date2

【问题讨论】:

  • 这是行查询还是列查询?如果是行查询,您使用的是什么行分区器?
  • 这是一个行查询,我们使用 Murmur3Partitioner 并且键在一个表中是 (key1, date, key2) 而在另一个表中是 ((key1, key2), date)。我想使用类似于SELECT * FROM table1 WHERE key1 = val1 AND key2 = val2 AND date &gt;= date1 AND date &lt;= date1

标签: cassandra cassandra-2.0 cqlsh


【解决方案1】:

对于PRIMARY KEY (key1, date, key2),这种类型的查询是不可能的。如果这样做,您将看到如下错误:

InvalidRequest: code=2200 [无效查询] message="PRIMARY KEY 列 “key2”不能被限制(前面的列“日期”要么不是 受限或非 EQ 关系)"

如果前面的列被除等于运算符之外的任何东西过滤,Cassandra 将不允许您按 PRIMARY KEY 组件过滤。

另一方面,您对PRIMARY KEY ((key1, key2), date) 的查询将正常工作并执行良好。原因是 Cassandra 使用集群键(在本例中为 date)来指定分区内数据的磁盘排序顺序。当您指定分区键(key1key2)时,您的结果集将按 date 排序,从而允许 Cassandra 通过从磁盘执行连续读取来满足您的查询。

为了测试一下,我什至会在具有相似键的表上运行两个查询,然后打开 tracing

SELECT * FROM log_date2 WHERe userid=1001 
AND time > 32671010-f588-11e4-ade7-21b264d4c94d 
AND time < a3e1f750-f588-11e4-ade7-21b264d4c94d;

返回 1 行并在 4068 微秒内完成。

SELECT * FROM log_date2 WHERe userid=1001 
AND time=74ad4f70-f588-11e4-ade7-21b264d4c94d;

返回 1 行并在 4001 微秒内完成。

【讨论】:

  • 我的意思并不完全是针对所有表的此查询,这是针对其中一个表的,如果您愿意,我将编辑该问题。我只对我使用“=”而不是“=”这一事实感兴趣,以及它是否会影响性能。
  • @mar 无需编辑。我的答案的第二部分解决了这个问题。如果您通过集群键进行范围查询,那么您的读取操作应该非常快。应该与使用 = 过滤一次日期没有明显不同
  • @Aaron 你测试时 log_date2 有多少行?
猜你喜欢
  • 2012-01-09
  • 2015-03-10
  • 1970-01-01
  • 2012-03-13
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
相关资源
最近更新 更多