Cassandra 索引如何存储和更新

索引如何存储和更新?

二级索引过滤表以存储在非主键列中的数据。例如,使用骑自行车者的姓作为主键来存储骑自行车者的姓名和年龄的表可能在年龄上具有次要索引,以允许按年龄查询。因为查询应始终导致从表中检索到连续的数据片,所以查询以匹配非主键列是一种反模式。

Cassandra 索引如何存储和更新_第1张图片

 

 

 

如果表行是根据姓氏存储的,则表可能会分布在存储在不同节点上的多个分区中。基于特定姓氏的查询(例如所有姓氏的自行车手)Matthews从表中检索顺序的行。但是,基于年龄的查询(例如的所有骑自行车者均为28)要求查询所有节点的值。可以使用年龄索引,但是更好的解决方案是创建一个物化视图或按年龄排序的其他表。

注意:非主键在排序存储中的数据时不起作用,因此查询非主键列的特定值将导致扫描所有分区。扫描所有分区通常会导致禁止的读取延迟,因此是不允许的。

可以为表中的列构建二级索引。这些索引在本地存储在隐藏表中的每个节点上,并在后台进程中构建。如果查询同时包括分区键条件和辅助索引列条件,则该查询将成功,因为该查询可以定向到单个节点分区。

如果在不限于特定分区键的查询中使用辅助索引,则该查询将具有禁止的读取延迟,因为将查询所有节点。仅当使用查询选项时,才允许使用这些参数进行查询ALLOW FILTERING此选项不适用于生产环境,并且不能保证无故障索引。必须知道何时使用索引

与关系数据库一样,保持索引为最新状态会占用处理时间和资源,因此应避免不必要的索引。列更新时,索引也会更新。如果内存表中仍然存在旧列值(通常在重复更新一小组行时发生),则数据库将删除相应的过时索引条目;否则,旧条目仍需通过压缩清除。如果读取在压缩清除之前看到过时的索引条目,则读取器线程会使它无效。

 

 

 

 

你可能感兴趣的:(Cassandra 索引如何存储和更新)