Cassandra 查询性能、范围
Cassandra queries performance, ranges
我对 Cassandra 很陌生,我想知道如果使用 "date = '2015-01-01'" 或 "date >= '2015-01-01' AND date <= '2015-01-01'".
询问查询是否会对性能产生任何影响
我想使用这样的范围的唯一原因是因为我需要进行多个查询并且我想让它们准备好(就像在准备好的语句中一样)。这样准备好的语句数量就减少了一半。
两个table中用到的key是((key1,key2),date)和(key1,date,key2)我想用这个。第一个 table 的查询类似于:
SELECT * FROM table1
WHERE key1 = val1
AND key2 = val2
AND date >= date1 AND date <= date2
对于 PRIMARY KEY (key1, date, key2)
那种类型的查询是不可能的。如果这样做,您会看到这样的错误:
InvalidRequest: code=2200 [Invalid query] message="PRIMARY KEY column
"key2" cannot be restricted (preceding column "date" is either not
restricted or by a non-EQ relation)"
如果前面的列被等号运算符以外的任何东西过滤,Cassandra 将不允许您按 PRIMARY KEY 组件过滤。
另一方面,您对 PRIMARY KEY ((key1, key2), date)
的查询将正常运行并执行良好。原因是 Cassandra 使用集群键(在本例中为 date
)来指定分区内数据的磁盘排序顺序。当您指定分区键(key1
和 key2
)时,您的结果集将按 date
排序,允许 Cassandra 通过从磁盘执行连续读取来满足您的查询。
只是为了测试一下,我什至会 运行 使用类似键在 table 上进行两次查询,然后打开 tracing:
SELECT * FROM log_date2 WHERe userid=1001
AND time > 32671010-f588-11e4-ade7-21b264d4c94d
AND time < a3e1f750-f588-11e4-ade7-21b264d4c94d;
Returns 1 行并在 4068 微秒内完成。
SELECT * FROM log_date2 WHERe userid=1001
AND time=74ad4f70-f588-11e4-ade7-21b264d4c94d;
Returns 1 行并在 4001 微秒内完成。
我对 Cassandra 很陌生,我想知道如果使用 "date = '2015-01-01'" 或 "date >= '2015-01-01' AND date <= '2015-01-01'".
询问查询是否会对性能产生任何影响我想使用这样的范围的唯一原因是因为我需要进行多个查询并且我想让它们准备好(就像在准备好的语句中一样)。这样准备好的语句数量就减少了一半。
两个table中用到的key是((key1,key2),date)和(key1,date,key2)我想用这个。第一个 table 的查询类似于:
SELECT * FROM table1
WHERE key1 = val1
AND key2 = val2
AND date >= date1 AND date <= date2
对于 PRIMARY KEY (key1, date, key2)
那种类型的查询是不可能的。如果这样做,您会看到这样的错误:
InvalidRequest: code=2200 [Invalid query] message="PRIMARY KEY column "key2" cannot be restricted (preceding column "date" is either not restricted or by a non-EQ relation)"
如果前面的列被等号运算符以外的任何东西过滤,Cassandra 将不允许您按 PRIMARY KEY 组件过滤。
另一方面,您对 PRIMARY KEY ((key1, key2), date)
的查询将正常运行并执行良好。原因是 Cassandra 使用集群键(在本例中为 date
)来指定分区内数据的磁盘排序顺序。当您指定分区键(key1
和 key2
)时,您的结果集将按 date
排序,允许 Cassandra 通过从磁盘执行连续读取来满足您的查询。
只是为了测试一下,我什至会 运行 使用类似键在 table 上进行两次查询,然后打开 tracing:
SELECT * FROM log_date2 WHERe userid=1001
AND time > 32671010-f588-11e4-ade7-21b264d4c94d
AND time < a3e1f750-f588-11e4-ade7-21b264d4c94d;
Returns 1 行并在 4068 微秒内完成。
SELECT * FROM log_date2 WHERe userid=1001
AND time=74ad4f70-f588-11e4-ade7-21b264d4c94d;
Returns 1 行并在 4001 微秒内完成。