列家族的最大二级索引

时间:2015-06-23 20:49:01

标签: cassandra data-modeling

如果我们在列家族中有两个或更多个二级索引,这是一个性能问题吗?我有orderid,city和shipmenttype。所以我想我在城市和货运类型的orderid和二级索引上创建了主键。并在查询时使用二级索引列的组合。这是一个糟糕的建模吗?

1 个答案:

答案 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 在查询表时使用多个二级索引,这将导致重大性能损失。

最终,您的性能取决于您如何根据分区和二级索引构建查询。

相关问题