📜  Apache Cassandra 中的索引概念

📅  最后修改于: 2021-09-10 02:28:54             🧑  作者: Mango

先决条件 – Apache Cassandra 简介
指数:
因为我们可以使用具有分区键的属性访问数据。例如,如果 Emp_id 是 Employee 表的列名,并且它是该表的分区键,那么我们可以在分区键的帮助下过滤或搜索数据。在这种情况下,我们可以使用 WHERE 子句来定义属性条件并搜索数据。
但是假设如果存在一个不是该表的分区键的列,并且我们想要使用 WHERE 子句过滤或搜索或访问数据,那么查询将不会被执行并且会给出错误。

因此,在这种情况下,要使用分区键以外的属性访问数据以快速有效地查找匹配给定条件的数据,那么我们需要定义索引。它可用于各种用途,例如集合、静态列、集合列以及除计数器列之外的任何其他列。

何时使用索引:

  1. 内置索引是具有多行且行包含索引值的表的最佳选择。
  2. 在特定列中哪个列具有更多唯一值,在这种情况下我们可以使用索引。
  3. 由于多种原因(例如具有更多条目的列)导致更多开销的表,然后在这种情况下我们可以使用索引。
  4. 为了查询和维护索引,我们可以使用索引,这在这种情况下总是一个不错的选择。

例子:
假设您有一个板球比赛条目表,其中包含数百场比赛中球员的一百万条目,并且想要通过比赛的次数来查找球员的排名。许多球员的排名将共享相同的比赛年份列值。 match_year 列是索引的不错选择。

创建索引的语法:

CREATE INDEX [ IF NOT EXISTS ] index_name
  ON [keyspace_name.]table_name
  ([ ( KEYS | FULL ) ] column_name) 
  (ENTRIES column_name); 

例子:
要创建表,使用 keyspace1 作为键空间和 Task 作为表名。我们来看一下。

CREATE TABLE keyspace1.Task 
(
   Task_id text,
   Task_name text,
   Task_time timestamp,
   T_location text,
   PRIMARY KEY (Task_id, Task_name)
); 

由于 Cassandra 是一个分布式、去中心化的数据库,数据按分区键组织,一般情况下,WHERE 子句查询需要包含一个分区键。

例子:

SELECT * 
FROM Task 
WHERE Task_id = ‘T210’; 

这个查询可以正常工作。

SELECT * 
FROM Task 
WHERE Task_id = ‘T210’ AND Task_name; ‘set alarm’; 

这个查询可以正常工作。

笔记:
在上表中,Task_id 和 Task_name 列是主键的一部分。

SELECT * FROM Task WHERE Task_time= ‘2019-09-30 15:02:56’; 

这个查询不起作用,因为我们可以看到这里的 Task_time 不是分区键的一部分。

错误:错误请求:带有 Equal运算符的列子句中不存在索引列。

通过在聚集列上创建索引来解决此类错误。定义一个具有复合分区键的表,然后在聚簇列上创建索引。

CREATE TABLE keyspace1.Task (
   Task_id text,
   Task_name text,
   Task_time timestamp,
   T_location text,
  PRIMARY KEY ((Task_id, Task_name), Task_time) 
);
      
CREATE INDEX ON keyspace1.Task(Task_time); 
SELECT * 
FROM Task 
WHERE Task_time= ‘2019-09-30 15:02:56’; 

现在这个查询将起作用:

笔记:
通过创建索引来创建二级索引并不意味着它会提高 Cassandra 中的查询速度。

二级索引的重要优势之一有助于访问数据,这可以简单地使 WHERE 子句引用主列和集群列之外的列中的值可以运行。

我们有更好的选择来提高 Cassandra 中的查询速度,即通过专门为查询创建一个表。
让我们再看一个例子。在这个例子中,Student_record 是一个表名,keyspace1 是一个键空间名。

CREATE TABLE Student_record 
(
  Stu_state text,
  Stu_zip text,
  Stu_address text,
  PRIMARY KEY(Stu_state, Stu_zip)
 ); 

在这个表中, Stu_stateStu_zip可能是一样的,为了在表中定义一个唯一的记录,我们可以添加Stu_id作为唯一定义记录的主键。

现在我们可以通过在 CQL 中使用 ALTER 命令对现有表进行修改。

ALTER TABLE Student_record ADD Stu_id int PRIMARY KEY; 

输出:

表: Student_record

要检查 Cassandra 中表的描述,请使用下面给出的以下 CQL 查询。
描述表Student_record;

SELECT * 
FROM Student_record 
WHERE Stu_id = '107'; 

输出:

表:输出

在 Cassandra 中创建复合分区键:
复合分区键定义为分区键具有多于一列的键,则称为复合分区键。

例子:

CREATE TABLE Registration (
  Name text,
  Date timestamp,
  Email text, 
  Query text,
  PRIMARY KEY((Name, Date), Email) WITH CLUSTERING ORDER BY(Date DESC); 
SELECT * 
FROM Registration LIMIT 2; 

笔记:
当我们创建索引时,Cassandra 中的每一行都有一个行键。在 Cassandra 中,非规范化数据很常见。二级索引使查询在 Cassandra 中运行得更快是错误的。括号用于指定复合分区键。