为什么二级索引在Cassandra中效率较低?

为什么二级索引在Cassandra中效率较低?,cassandra,nosql,distributed-database,secondary-indexes,Cassandra,Nosql,Distributed Database,Secondary Indexes,我在Cassandra文档中读到,创建二级索引的效率较低,因为在最坏的情况下,它需要接触所有节点才能找到非键列的数据 但我的疑问是,即使我们不创建二级索引,它也必须接触所有节点(在最坏的情况下),并找出具有此非键列值的特定行所在的位置 注意:是的,我知道如果基数很高,那么二级索引可能包含(存储)大部分所有行的索引,这样在存储方面就不好了。但我想知道,不创建二级索引比创建二级索引更有效吗?二级索引应该只在特定情况下使用,例如,当您将它们与分区键列上的条件一起使用时,数据的基数是正确的,等等 例如,

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

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


注意:是的,我知道如果基数很高,那么二级索引可能包含(存储)大部分所有行的索引,这样在存储方面就不好了。但我想知道,不创建二级索引比创建二级索引更有效吗?

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

例如,如果我们有下表:

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
因为您仅将查询的执行限制为值为
123
pk
的副本节点

但如果你这样做了

select * from test.test where val2 = 10
然后Cassandra将需要到每个节点,并在那里请求数据-这将慢得多,并对协调节点施加压力

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

您可以在以下内容中找到有关二级索引实现的技术细节

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

  • 基于ApacheSolr的DSE搜索,因此您可以获得很大的灵活性(全文搜索、范围查询等)
  • 新的实现称为SSTable-Attached-Indexes(SAI)——它们目前被标记为beta,但它们比标准的二级索引提供了更大的灵活性,比DSE搜索的开销更小

这篇文章很好地解释了这一点