Cassandra 列族上的最大次索引数

Cassandra 列族上的最大次索引数,cassandra,data-modeling,Cassandra,Data Modeling,如果我们在一个columnfamily上有两个或多个二级索引,这是性能问题吗?我有orderid、city和shipmenttype。所以我想我在orderid上创建主键,在city和shipmenttype上创建二级索引。并在查询时使用二级索引列的组合。这是一个糟糕的建模吗?考虑一下将放在二级索引中的数据。查看,您希望避免具有高基数的列。如果您的城市和装运类型值相差很大(或者相反,相差太大),则二级索引可能不合适 查看是否有可能使用此信息维护一个单独的表。这将作为一个排序的手动索引,但还有一个

如果我们在一个columnfamily上有两个或多个二级索引,这是性能问题吗?我有orderid、city和shipmenttype。所以我想我在orderid上创建主键,在city和shipmenttype上创建二级索引。并在查询时使用二级索引列的组合。这是一个糟糕的建模吗?

考虑一下将放在二级索引中的数据。查看,您希望避免具有高基数的列。如果您的城市和装运类型值相差很大(或者相反,相差太大),则二级索引可能不合适

查看是否有可能使用此信息维护一个单独的表。这将作为一个排序的手动索引,但还有一个额外的好处,即按照您所期望的Cassandra表进行操作。创建或更新记录时,请确保更新此索引表。写操作很便宜,在更新记录的过程中执行多次写操作并非闻所未闻

在查看访问模式时,您是将分区键用作WHERE子句的一部分,还是仅使用辅助索引

如果您对辅助索引以及分区键执行查询,那么与仅使用辅助索引进行查询相比,您将获得更好的性能

例如,使用
WHERE orderid='foo'和shipmenttype='bar'
时,请求将只发送到负责存储
foo
的分区的节点。然后将为
shipmenttype='bar'
查询二级索引,并返回结果

当您仅使用
WHERE shipmenttype='bar'
运行查询时,查询将发送到集群中的所有节点,然后再查询辅助索引以查找行。这不太理想

此外,如果您使用单个请求进行查询,则必须使用
允许筛选
。在您的请求期间,这将只参考一个辅助索引,通常是引用的更具体的索引。这将导致性能下降,因为检查第一个索引返回的所有记录都需要检查
WHERE
子句中列出的其他值

如果要使用辅助索引,请始终努力包含查询的分区键部分。其次,在查询表时不要使用多个二级索引,这将导致严重的性能损失

最终,性能取决于如何针对分区和辅助索引构造查询