可变列的范围查询 - SASI索引的使用和限制?

时间:2017-12-06 06:29:01

标签: cassandra datastax-enterprise cassandra-3.0 cassandra-sasi-index

我遇到一个用例,意味着一个包含过期日期的列必须定期更新并使用范围/切片查询进行过滤。

描述

该表用于维护要处理的元素列表。首先,检索候选列表(具有过去的过期日期),然后用对应于元素的最大处理时间的新的到期日期更新每个元素。当元素处理完成时,到期时间被更新为最大长值,即它永不过期。我知道它看起来像一个队列,它是卡桑德拉的反模式。完整模型更复杂,但我已经简化为范围/切片查询问题。

表格定义如下。

CREATE TABLE IF NOT EXISTS element_status (
partitionkey text,
elementid text,
lockexpirationinmillissinceepoch bigint,
PRIMARY KEY((partitionkey), requestid)) with default_time_to_live = 604800;

初始插入。

INSERT INTO element_status (partitionkey, elementid,clientCallUuid, lockexpirationinmillissinceepoch) VALUES (‘mypartition’, ‘06e6668c-ebad-4e16-9329-a8854ebf1c32’, 123455);

检索候选人的查询

SELECT * FROM element_status WHERE
    partitionKey='partitionKey' AND
    lockExpirationInMillisSinceEpoch < 123456
    LIMIT 123 ALLOW FILTERING;

“锁定”元素的查询,即更新到期日期

UPDATE element_status SET
    lockExpirationInMillisSinceEpoch=135456
  WHERE partitionKey='partitionKey' AND
    requestId='requestId';

“完成”元素的查询。

UPDATE keyspaceName.async_message_status SET
    lockExpirationInMillisSinceEpoch=9223372036854775807
  WHERE partitionKey='partitionKey' AND
    requestId='requestId';

对于范围/切片查询,已使用以下定义创建SASI索引。

CREATE CUSTOM INDEX IF NOT EXISTS element_status_lock_expiration_in_millis_since_epoch_index ON element_status (lockExpirationInMillisSinceEpoch) USING 'org.apache.cassandra.index.sasi.SASIIndex';

按分区划分的预期数量是每天约200,000条记录,TTL是一周。

我使用最新的Cassandra版本(3.11.1)。

问题

但是,不建议在生产中使用SASI索引。 我想评估此SASI索引可能出现的问题。

  • 即使初始插入日期是过去的,也不会检索到元素吗?
  • 过去一次或多次更新和过期后的同一问题?
  • 是否会出现任何性能问题?

还在Cassandra user list上提出了问题。

0 个答案:

没有答案