我的模型设计从复选框保存单词搜索,它必须有更新单词搜索和状态,删除(假)。我的旧模型设置pk是uuid(单词搜索的id),设置索引是状态(启用,禁用,删除)
但我不想在状态列设置索引(我认为在更新列设置索引非常糟糕)而且我不更改数据库
是否有更好的方法来模拟这个?
抱歉我的英语语法答案 0 :(得分:0)
您不应在非常低的基数列状态
上创建索引避免非常低的基数指数,例如index其中不同值的数量非常低。一个很好的例子是关于用户性别的索引。在每个节点上,整个用户群将仅分布在索引的2个不同分区上:MALE&女。如果每个节点的用户数量非常密集(例如数百万),我们将为MALE& FEMALE索引,这是不好的
来源:https://www.datastax.com/dev/blog/cassandra-native-secondary-index-deep-dive
处理此类案件的最佳方式:
第二选项的示例
CREATE TABLE save_search (
year int,
status int,
uuid uuid,
category text,
word_search text,
PRIMARY KEY((year, status), uuid)
);
在这里,您可以看到我使用year
和status
制作了复合分区键,因为基数较低的问题。如果您认为大量数据将处于单一状态,那么您还应将月份添加为复合分区键的一部分
如果您的数据集很小,您只需删除年份字段即可。
CREATE TABLE save_search (
status int,
uuid uuid,
category text,
word_search text,
PRIMARY KEY(status, uuid)
);
或
如果您使用的是cassandra 3.x或更高版本,则可以使用materialized view
CREATE MATERIALIZED VIEW search_by_status AS
SELECT *
FROM your_main_table
WHERE uuid IS NOT NULL AND status IS NOT NULL
PRIMARY KEY (status, uuid);
您可以使用以下状态查询:
SELECT * FROM search_by_status WHERE status = 0;
您在主表cassandra上进行的所有删除,更新和插入都会将其与物化视图同步