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

nszi6y05  于 2021-06-13  发布在  Cassandra
关注(0)|答案(1)|浏览(994)

我在cassandra文档中读到,创建二级索引效率较低,因为在最坏的情况下,它需要接触所有节点才能找到非键列的数据。
但我的疑问是,即使我们不创建二级索引,它也必须接触所有节点(在最坏的情况下)并找出具有此非键列值的特定行所在的位置。
注意:是的,我知道如果基数很高,那么辅助索引可能包含(存储)大部分所有行的索引,这样在存储方面就不好了。但我想知道不创建二级索引比创建二级索引效率如何?

gorkyyrv

gorkyyrv1#

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

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索引从设计的Angular 来看更好,尽管它们仍然是实验性的,并且在实现上有问题。
您可以在下面的博客文章中找到关于二级索引实现的技术细节。
datastax在商业产品中有其他实现:
dse搜索是基于apachesolr的,因此您可以获得很大的灵活性(全文搜索、范围查询等)
新的实现称为sstable-attached-indexes(sai)——它们目前被标记为beta,但是它们比标准的二级索引提供了更大的灵活性,比dse搜索的开销更小

相关问题