Концепция индексации в Apache Cassandra

Опубликовано: 17 Августа, 2021

Предварительное условие - Введение в Apache Cassandra
Индекс:
Поскольку мы можем получить доступ к данным, используя атрибуты, у которых есть ключ раздела. Например, если Emp_id - это имя столбца для таблицы Employee, и если это ключ раздела этой таблицы, то мы можем фильтровать или искать данные с помощью ключа раздела. В этом случае мы можем использовать предложение WHERE для определения условия над атрибутом и для поиска данных.
Но предположим, что если существует столбец, который не является ключом раздела этой таблицы, и мы хотим отфильтровать, выполнить поиск или получить доступ к данным с помощью предложения WHERE, тогда запрос не будет выполнен и выдаст ошибку.

Итак, чтобы получить доступ к данным в этом случае с использованием атрибутов, отличных от ключа раздела, для быстрого и эффективного поиска данных, соответствующих заданному условию, нам необходимо определить индекс. Его можно использовать для различных целей, например, для коллекций, статических столбцов, столбцов коллекции и любых других столбцов, кроме столбцов счетчиков.

Когда использовать индекс:

  1. Встроенные индексы - лучший вариант для таблицы, в которой много строк и строки содержат индексированное значение.
  2. В конкретном столбце, столбец которого имеет более уникальные значения, в этом случае мы можем использовать индексацию.
  3. Таблица, у которой больше накладных расходов из-за нескольких причин, таких как столбец, имеющий больше записей, чем в этом случае мы можем использовать индексацию.
  4. Для запроса и поддержки индекса мы можем использовать индексацию, которая в этом случае всегда является хорошим вариантом.

Пример:
Предположим, у вас есть таблица записей матчей по крикету с миллионом записей для игроков в сотнях матчей, и вы хотите узнать рейтинг игрока по количеству сыгранных матчей. Ряды многих игроков будут иметь одинаковое значение столбца для года матча. Столбец match_year - хороший вариант для индекса.

Синтаксис для создания индекса:

СОЗДАТЬ ИНДЕКС [ЕСЛИ НЕ СУЩЕСТВУЕТ] имя_индекса
  ON [имя_ключевого_пространства.] Имя_таблицы
  ([(KEYS | FULL)] имя_столбца) 
  (ENTRIES имя_столбца);

Пример:
Для создания таблицы используется keypace1 как пространство ключей и Task как имя таблицы. Давайте посмотрим.

 СОЗДАТЬ ТАБЛИЦУ keypace1.Task 
(
   Текст Task_id,
   Текст имени задачи,
   Отметка времени Task_time,
   T_location текст,
   ПЕРВИЧНЫЙ КЛЮЧ (Task_id, Task_name)
);

Поскольку Cassandra - это распределенная и децентрализованная база данных с данными, упорядоченными по ключу раздела, в общем случае запросы предложения WHERE должны включать ключ раздела.

Пример:

 ВЫБРАТЬ * 
ОТ Задачи 
ГДЕ Task_id = 'T210';

Этот запрос будет работать нормально.

 ВЫБРАТЬ * 
ОТ Задачи 
ГДЕ Task_id = 'T210' И имя_задачи; 'установить будильник';

Этот запрос будет работать нормально.

Примечание:
В приведенной выше таблице столбцы Task_id и Task_name являются частью первичного ключа.

 ВЫБРАТЬ * ИЗ задачи ГДЕ Task_time = '2019-09-30 15:02:56';

Этот запрос не будет работать, потому что, как мы видим, здесь Task_time не является частью ключа раздела.

Ошибка: неверный запрос: нет индексированных столбцов в предложении by columns с оператором Equal.

Для устранения такого типа ошибок путем создания индекса по столбцу кластеризации. Определите таблицу с составным ключом раздела, а затем создайте индекс для столбца кластеризации.

 СОЗДАТЬ ТАБЛИЦУ keypace1.Task (
   Текст Task_id,
   Текст имени задачи,
   Отметка времени Task_time,
   T_location текст,
  ПЕРВИЧНЫЙ КЛЮЧ ((Task_id, Task_name), Task_time) 
);
      
СОЗДАТЬ ИНДЕКС НА keypace1.Task (Task_time);
 ВЫБРАТЬ * 
ОТ Задачи 
ГДЕ Task_time = '2019-09-30 15:02:56';

Теперь этот запрос будет работать:

Примечание:
Создание такого индекса, при котором создание вторичных индексов не означает, что это увеличит скорость запросов в Cassandra.

Одно из важных преимуществ вторичных индексов помогает в доступе к данным, которые могут просто сделать так, чтобы могли выполняться предложения WHERE, которые ссылаются на значения в столбце за пределами первичного столбца и столбца кластеризации.

У нас есть лучший вариант увеличить скорость запросов в Cassandra, создав таблицу специально для запроса.
Давайте посмотрим на другой пример. В этом примере Student_record - это имя таблицы, а keyspace1 - имя пространства ключей.

 СОЗДАТЬ ТАБЛИЦУ Student_record 
(
  Stu_state текст,
  Текст Stu_zip,
  Stu_address текст,
  ПЕРВИЧНЫЙ КЛЮЧ (Stu_state, Stu_zip)
 );

Здесь в этой таблице Stu_state и Stu_zip могут быть одинаковыми, поэтому для определения уникальной записи в таблице мы можем добавить Stu_id в качестве первичного ключа, который однозначно определяет запись.

Теперь мы можем внести изменения в существующую таблицу, используя команду ALTER в CQL.

 ИЗМЕНИТЬ ТАБЛИЦУ Student_record ДОБАВИТЬ Stu_id int PRIMARY KEY;

Выход:


Таблица: Student_record

Чтобы проверить описание таблицы в Cassandra, используется следующий CQL-запрос, приведенный ниже.
Опишите таблицу Student_record;

 ВЫБРАТЬ * 
ОТ Student_record 
ГДЕ Stu_id = '107';

Выход:


Таблица: Выход

Чтобы создать ключ Composite Partition в Cassandra:
Составной ключ раздела определяется как ключ, в котором ключ раздела имеет более одного столбца, тогда он называется составным ключом раздела.

Пример:

 СОЗДАТЬ ТАБЛИЦУ Регистрация (
  Текст имени,
  Отметка времени даты,
  Текст электронной почты, 
  Текст запроса,
  ПЕРВИЧНЫЙ КЛЮЧ ((Имя, Дата), Электронная почта) С ПОРЯДОМ КЛАСТЕРИИ ПО (Дата УДАЛ.);
 ВЫБРАТЬ * 
С ОГРАНИЧЕНИЯ 2 регистрации;

Примечание:
Когда мы создаем индекс, для каждой строки в Cassandra есть ключ строки. В Cassandra обычно есть денормализованные данные. Неверно, что вторичные индексы ускоряют выполнение запросов в Cassandra. Круглые скобки используются для указания составного ключа раздела.