创建并删除索引 Cassandra

⚡ 智能摘要

在……中创建和删除索引 Cassandra 允许对非主键列进行筛选。本页内容涵盖 CREATE INDEX 和 DROP INDEX 命令、命名规则、可用索引类型以及索引不适用的情况。

  • 🔎 为什么选择索引: 如果没有索引,WHERE 子句只能引用主键列。
  • 🏷️ 命名规则: 创建时会生成一个未命名的索引,其名称为 TableName_ColumnName_idx,必须按该名称删除该索引。
  • 🔁 自动维护: 现有行在创建时建立索引,新行在写入时建立索引,无需其他操作。
  • 🚫 限制: 主键列已经建立了索引,因此拒绝在其上建立二级索引。
  • 📉 基数很重要: 列的基数过高或过低都会导致索引速度变慢甚至无法使用。
  • 🧱 更好的选择: 在大规模应用中,专用查询表通常比二级索引性能更好。

创建和删除索引 Cassandra

Cassandra 创建索引

命令“创建索引”在用户指定的列上创建索引。如果要索引的列的数据已经存在, Cassandra 在“create index”语句执行期间对数据创建索引。

  • 创建索引后, Cassandra 当插入数据时自动索引新数据。
  • 无法在主键上创建索引,因为主键已被索引。
  • 支持对集合列创建索引,根据需要搜索的内容,可以使用 KEYS、VALUES 或 ENTRIES 形式。
  • 如果未对列建立索引, Cassandra 除非该列是主键,否则无法对其进行筛选。

这就是为什么需要对列进行筛选的原因 Cassandra需要创建索引。

句法

CREATE INDEX IndexName ON KeyspaceName.TableName (ColumnName);

例如:

以下是尝试过滤“dept”列而不创建索引的快照。结果返回了错误。

Cassandra 创建索引

这是在 dept 列上创建索引的快照。

Cassandra 创建索引

CREATE INDEX DeptIndex ON University.Student (dept);

这是成功过滤“dept”列的快照。

Cassandra 创建索引

SELECT * FROM University.Student WHERE dept = 'CS';

索引名称是可选的。省略索引名称会…… Cassandra 自动生成一个索引,这在以后需要删除索引时很重要。

CREATE INDEX IF NOT EXISTS ON University.Student (dept);

Cassandra 删除索引

命令“Drop index”删除指定索引。如果在创建索引时未指定索引名称,则索引名称为 TableName_ColumnName_idx。

  • 如果索引不存在,它将返回错误,除非使用 IF EXISTS,否则将返回无操作。
  • 必须将键空间名称与索引名称一起指定,否则将在当前键空间中查找索引。

句法

DROP INDEX IF EXISTS KeyspaceName.IndexName;

例如:

这是执行命令“Drop index”的快照,该命令删除了索引 DeptIndex。

Cassandra 删除索引

DROP INDEX IF EXISTS University.DeptIndex;

命令执行成功后,DeptIndex 将从键空间中删除。现在无法按列 dept 过滤数据。

在删除之前确认哪些索引存在。ping 第一,描述表格并阅读输出底部的索引定义。

DESCRIBE TABLE University.Student;

索引类型 Cassandra

上面的命令创建了一个标准的二级索引,但实际上存在三种不同的机制,它们的行为也截然不同。

类型 它是如何运行的? 最适合
二级索引 每个节点只索引自己的本地数据,因此没有分区键的查询必须联系每个节点。 与分区键一起查询中等基数列。
SASI指数 附加索引支持 LIKE 前缀和后缀匹配以及数值范围。 文本搜索模式。目前仍处于实验阶段,请在正式使用前进行测试。
存储附加索引 (SAI) 介绍 Cassandra 5.0,跨列共享一个索引结构,写入开销更低。 以上两者的现代替代品是…… Cassandra 5 个集群。

对集合列进行索引时,会使用修饰符来指定要索引的部分。

CREATE INDEX ON University.Teacher (VALUES(Email));
CREATE INDEX ON University.Course (KEYS(prereq));
CREATE INDEX ON University.Course (ENTRIES(prereq));

VALUES 用于搜索集合或列表中的元素,KEYS 用于搜索映射键,ENTRIES 用于匹配键值对。集合索引将在后续章节中详细介绍。 Cassandra 收藏 教程。

何时不应使用索引 Cassandra

辅助索引虽然方便,但它并非关系索引,在错误的位置使用辅助索引是导致集群运行缓慢的常见原因。以下四种情况需要采用不同的方法。

  • 基数非常高。 对接近唯一值的内容(例如电子邮件地址)进行索引,意味着几乎每个分区都包含一个匹配的行,因此查询会遍历整个集群以返回单个记录。
  • 基数非常低。 对像 active 或 inactive 这样的双值标志进行索引会产生巨大的索引分区,读取一个分区会返回半个表。
  • 经常更新的专栏。 每次更改都会写入一个索引条目和一个旧条目的墓碑,因此墓碑的积累会随着时间的推移降低读取性能。
  • 没有分区键的查询。 如果没有协调器,协调器必须联系每个节点并合并结果,随着节点的增加,这种方法无法扩展。

更持久的替代方案是创建第二个表,该表以需要搜索的列为键,并与第一个表同时写入。这遵循了查询优先原则,如前所述。 Cassandra 数据模型规则它将每次读取操作都保存在单个节点上的单个分区中。

一般来说,索引适用于基数适中的列,并且该列需要与已知的分区键一起查询。超出此范围的情况,最好使用专门创建的表。

常见问题

虽然没有硬性限制,但每个索引都会增加写入成本和内存占用。每个表两到三个索引是一个比较实际的上限;超过这个数量,就应该重新考虑数据模型。

不。现有行会在后台进行索引,表仍然可用。大型表需要时间,可以使用 `nodetool compactionstats` 命令查看进度。

索引指向基表中的行。物化视图是一个独立的表,它有自己的分区键,并由系统自动维护,因此其读取操作只会访问一个分区。

根据查询列表和列基数,人工智能可以对候选索引进行合理的排序。但它无法了解更新频率,而更新频率通常决定索引是否会积累失效索引。

通常情况下,这是因为它会使被拒绝的查询执行一次。将此建议视为一个信号,表明确实需要创建索引或新的查询表。

总结一下这篇文章: