为什么二级索引在 Cassandra 中效率较低?
Why secondary indexes are less efficient in Cassandra?
我在 Cassandra 文档中读到创建二级索引的效率较低,因为在最坏的情况下它需要接触所有节点才能找出该非键列的数据。
但我怀疑即使我们不创建二级索引,它也必须接触所有节点(在最坏的情况下)并找出具有此非键列值的特定行所在的位置。
注意:是的,我知道如果基数很高,那么二级索引可能会包含(存储)几乎所有行的索引,这样在存储方面是不好的。但是我想知道不创建二级索引比创建二级索引效率高吗?
二级索引应仅在特定情况下使用,例如,当您将它们与分区键列的条件一起使用时,您具有正确的数据基数等。
例如,如果我们有以下 table:
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 搜索更少
我在 Cassandra 文档中读到创建二级索引的效率较低,因为在最坏的情况下它需要接触所有节点才能找出该非键列的数据。
但我怀疑即使我们不创建二级索引,它也必须接触所有节点(在最坏的情况下)并找出具有此非键列值的特定行所在的位置。
注意:是的,我知道如果基数很高,那么二级索引可能会包含(存储)几乎所有行的索引,这样在存储方面是不好的。但是我想知道不创建二级索引比创建二级索引效率高吗?
二级索引应仅在特定情况下使用,例如,当您将它们与分区键列的条件一起使用时,您具有正确的数据基数等。
例如,如果我们有以下 table:
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 搜索更少