4

从下面的表格模式中,我试图选择所有低于 5 的 pH 读数。

我遵循了以下三个建议:

  1. 使用允许过滤
  2. 包括相等比较
  3. 在 reading_value 列上创建二级索引。

这是我的查询:

select * from todmorden_numeric where sensor_name = 'pHradio' and reading_value < 5  allow filtering;

这条消息被拒绝:

Bad Request: No indexed columns present in by-columns clause with Equal operator

我尝试向 sensor_name 列添加二级索引,并被告知它已经是键的一部分,因此已经被索引。

我在表使用了一段时间后创建了索引 - 这可能是问题吗?我运行“nodetool refresh”,希望它能使索引可用,但这不起作用。这是输出describe table todmorden_numeric

CREATE TABLE todmorden_numeric (
  sensor_name text,
  reading_time timestamp,
  reading_value float,
  PRIMARY KEY ((sensor_name), reading_time)
) WITH
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='Data that suits being stored as floats' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=864000 AND
  index_interval=128 AND
  read_repair_chance=0.100000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  default_time_to_live=0 AND
  speculative_retry='99.0PERCENTILE' AND
  memtable_flush_period_in_ms=0 AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'LZ4Compressor'};

CREATE INDEX todmorden_numeric_reading_value_idx ON todmorden_numeric (reading_value);
4

1 回答 1

9

Cassandra 只允许范围搜索:

a) 仅当使用 ByteOrderPartitioner 时才使用分区键(现在默认为 murmur3)。

b) 仅当在主键定义中的目标列之前定义的任何集群键已经由谓词中的 = 运算符指定时,才可以使用任何单个集群键。

它们不适用于二级索引。

考虑下面的表定义:

CREATE TABLE tod1 (name text, time timestamp, 
    val float, PRIMARY KEY (name, time));

在这种情况下,你不能在 val 上做一个范围。

考虑这个:

CREATE TABLE tod2 (name text, time timestamp, 
    val float, PRIMARY KEY (name, time, val));

那么以下是有效的:

SELECT * FROM tod2 WHERE name='X' AND time='timehere' AND val < 5; 

有点毫无意义,但这是无效的:

SELECT * from tod2 WHERE name='X' AND val < 5; 

它无效,因为您没有按主键 def 中的先前集群键(在本例中为时间)进行过滤。

对于您的查询,您可能希望这样做:

CREATE TABLE tod3 (name text, time timestamp, 
    val float, PRIMARY KEY (name, val, time));

注意主键中列的顺序:val 在时间之前。

这将允许您执行以下操作:

SELECT * from tod3 WHERE name='asd' AND val < 5;

另一方面,您打算保留数据多长时间?你多久阅读一次?这可能会导致您的分区很快变得非常大。您可能希望将它的读数存储到多个分区中(手动分片)。也许每天一个分区?当然,这些事情在很大程度上取决于您的访问模式。

希望有帮助。

于 2014-07-23T17:18:26.223 回答