如果我们在列家族中有两个或更多个二级索引,这是一个性能问题吗?我有orderid,city和shipmenttype。所以我想我在城市和货运类型的orderid和二级索引上创建了主键。并在查询时使用二级索引列的组合。这是一个糟糕的建模吗?
答案 0 :(得分:1)
考虑将放置在二级索引中的数据。查看docs,您希望避免使用具有高基数的列。如果您的城市和货运类型值差别很大(或相反地,类似),那么二级索引可能不合适。
查看可能会使用此信息维护一个单独的表。这将作为排序的手动索引,但具有与您期望的Cassandra表应该表现的额外好处。创建或更新记录时,请务必更新此索引表。写入很便宜,在更新记录的过程中执行多次写入并非闻所未闻。
在查看您的访问模式时,您将使用分区键作为WHERE子句的一部分还是只使用二级索引?
如果您正在对二级索引和分区键执行查询,那么与使用二级索引查询时相比,您将获得更好的性能。
例如,对于WHERE orderid = 'foo' AND shipmenttype = 'bar'
,请求只会发送到负责存储foo
的分区的节点。然后将查询shipmenttype = 'bar'
的二级索引,并返回结果。
当您使用WHERE shipmenttype = 'bar'
运行查询时,查询将发送到群集中的所有节点,然后查询二级索引以查找行。这不太理想。
此外,如果您使用单个请求查询multiple secondary indexes,则必须使用ALLOW FILTERING
。这只会在您的请求期间查询 ONE 二级索引,通常是引用的索引中更具体的索引。这会导致性能下降,因为检查第一个索引返回的所有记录都需要检查WHERE
子句中列出的其他值。
如果您使用二级索引始终努力包含查询的分区键部分。其次, NOT 在查询表时使用多个二级索引,这将导致重大性能损失。
最终,您的性能取决于您如何根据分区和二级索引构建查询。