Концепция индексации в Apache Cassandra
Предварительное условие - Введение в Apache Cassandra
Индекс:
Поскольку мы можем получить доступ к данным, используя атрибуты, у которых есть ключ раздела. Например, если Emp_id - это имя столбца для таблицы Employee, и если это ключ раздела этой таблицы, то мы можем фильтровать или искать данные с помощью ключа раздела. В этом случае мы можем использовать предложение WHERE для определения условия над атрибутом и для поиска данных.
Но предположим, что если существует столбец, который не является ключом раздела этой таблицы, и мы хотим отфильтровать, выполнить поиск или получить доступ к данным с помощью предложения WHERE, тогда запрос не будет выполнен и выдаст ошибку.
Итак, чтобы получить доступ к данным в этом случае с использованием атрибутов, отличных от ключа раздела, для быстрого и эффективного поиска данных, соответствующих заданному условию, нам необходимо определить индекс. Его можно использовать для различных целей, например, для коллекций, статических столбцов, столбцов коллекции и любых других столбцов, кроме столбцов счетчиков.
Когда использовать индекс:
- Встроенные индексы - лучший вариант для таблицы, в которой много строк и строки содержат индексированное значение.
- В конкретном столбце, столбец которого имеет более уникальные значения, в этом случае мы можем использовать индексацию.
- Таблица, у которой больше накладных расходов из-за нескольких причин, таких как столбец, имеющий больше записей, чем в этом случае мы можем использовать индексацию.
- Для запроса и поддержки индекса мы можем использовать индексацию, которая в этом случае всегда является хорошим вариантом.
Пример:
Предположим, у вас есть таблица записей матчей по крикету с миллионом записей для игроков в сотнях матчей, и вы хотите узнать рейтинг игрока по количеству сыгранных матчей. Ряды многих игроков будут иметь одинаковое значение столбца для года матча. Столбец 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;
Выход:
Чтобы проверить описание таблицы в Cassandra, используется следующий CQL-запрос, приведенный ниже.
Опишите таблицу Student_record;
ВЫБРАТЬ * ОТ Student_record ГДЕ Stu_id = '107';
Выход:
Чтобы создать ключ Composite Partition в Cassandra:
Составной ключ раздела определяется как ключ, в котором ключ раздела имеет более одного столбца, тогда он называется составным ключом раздела.
Пример:
СОЗДАТЬ ТАБЛИЦУ Регистрация ( Текст имени, Отметка времени даты, Текст электронной почты, Текст запроса, ПЕРВИЧНЫЙ КЛЮЧ ((Имя, Дата), Электронная почта) С ПОРЯДОМ КЛАСТЕРИИ ПО (Дата УДАЛ.);
ВЫБРАТЬ * С ОГРАНИЧЕНИЯ 2 регистрации;
Примечание:
Когда мы создаем индекс, для каждой строки в Cassandra есть ключ строки. В Cassandra обычно есть денормализованные данные. Неверно, что вторичные индексы ускоряют выполнение запросов в Cassandra. Круглые скобки используются для указания составного ключа раздела.