2

我在 Cassandra 文档中读到,创建二级索引的效率较低,因为在最坏的情况下,它需要接触所有节点才能找出该非键列的数据。

但我的疑问是,即使我们不创建二级索引,它也必须接触所有节点(在最坏的情况下)并找出具有此非键列值的特定行所在的位置。

注意:是的,我知道如果基数很高,那么二级索引可能会包含(存储)大多数行的索引,这样就存储而言很糟糕。但是我想知道不创建二级索引比创建二级索引效率如何?

4

1 回答 1

3

二级索引应仅在特定情况下使用,例如,当您将它们与分区键列的条件一起使用时,您具有正确的数据基数等。

例如,如果我们有下表:

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具有 value的副本的节点123

但如果你这样做

select * from test.test where val2 = 10

然后 Cassandra 将需要去每个节点,并在那里请求数据 - 它会慢得多,并对协调节点施加压力。

标准二级索引还有其他限制,例如,仅搜索特定值、列具有非常低或非常高的基数时的问题等。SASI 索引从设计的角度来看更好,尽管它们仍处于试验阶段,并且在实现方面存在问题。

您可以在以下博客文章中找到有关二级索引实现的技术细节。

DataStax 在商业产品中有其他实现:

  • 基于 Apache Solr 的 DSE 搜索,因此您可以获得很大的灵活性(全文搜索、范围查询等)
  • 称为 SSTable 附加索引 (SAI) 的新实现 - 它们目前被标记为 beta,但它们提供比标准二级索引更大的灵活性,并且比 DSE 搜索具有更少的开销
于 2020-05-22T09:44:04.423 回答