我在Cassandra文档中看到,创建二级索引的效率较低,因为在最坏的情况下,它需要接触所有节点才能找到该非键列的数据。
但我怀疑,即使我们不创建二级索引,它也必须触及所有节点(在最坏的情况下),并找出具有这个非键列值的特定行位于何处。
注意:是的,我知道,如果基数很高,则次要索引将包含(存储)索引,大多数行都是这样,这样就不利于存储。但我想知道,不创建二级索引比创建二级索引更有效?
发布于 2020-05-22 09:44:04
辅助索引只应在特定情况下使用,例如,当您将它们与分区键列上的条件一起使用时,数据具有正确的基数,等等。
例如,如果我们有下表:
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
然后卡桑德拉将需要到每个节点,并要求那里的数据-它会慢得多,并给协调节点的压力。
标准二级索引还有其他的局限性,如只搜索特定的值,当列的基数很低或很高时出现的问题等。从设计角度看,SASI索引更好,尽管它们仍然是实验性的,而且在实现上也存在问题。
您可以在下面的博客帖子中找到有关实现辅助索引的技术细节。
DataStax在商业产品中还有其他实现:
https://stackoverflow.com/questions/61944845
复制相似问题