二级索引只应在特定情况下使用,例如,当您将它们与分区键列的条件一起使用时,您具有正确的数据基数等。
例如,如果我们有下表:
create table test.test (
pk int,
c1 int,
val1 int,
val2 int,
primary key(pk, c1));
并且您在val2 列上创建了二级索引,那么以下查询将非常有效:
select * from test.test where pk = 123 and val2 = 10
因为您将查询的执行仅限于作为 pk 的副本且值为 123 的节点。
如果你这样做了
select * from test.test where val2 = 10
然后 Cassandra 将需要去每个节点,并在那里请求数据 - 它会慢得多,并对协调节点施加压力。
标准二级索引还有其他限制,例如,仅搜索特定值,当列具有非常低或非常高的基数时出现问题等。SASI 索引从设计的角度来看更好,虽然它们仍然是实验性的,并且存在问题执行。
您可以在以下blog post中找到有关二级索引实现的技术细节。
DataStax 在商业产品中有其他实现:
- 基于 Apache Solr 的 DSE 搜索,因此您可以获得很大的灵活性(全文搜索、范围查询等)
- 称为 SSTable 附加索引 (SAI) 的新实现 - 它们目前被标记为测试版,但它们提供比标准二级索引更大的灵活性,并且开销低于 DSE 搜索