Створіть і вставте INDEX 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 Індекс падіння

Команда «Скинути індекс» видаляє вказаний індекс. Якщо ім’я індексу не вказано під час створення індексу, тоді ім’я індексу буде TableName_ColumnName_idx.

  • Якщо індекс не існує, він поверне помилку, якщо не використано IF EXISTS, який поверне no-op.
  • Ви повинні вказати назву простору ключів разом з назвою індексу, інакше індекс буде шукатися в поточному просторі ключів.

синтаксис

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

Вторинний індекс зручний, але він не є реляційним індексом, і його використання в неправильному місці є поширеною причиною повільних кластерів. Чотири ситуації вимагають іншого підходу.

  • Дуже висока кардинальність. Індексація чогось близького до унікального, наприклад, адреси електронної пошти, означає, що майже кожен розділ містить один відповідний рядок, тому запит розходиться по всьому кластеру, щоб повернути один запис.
  • Дуже низька кардинальність. Індексація прапорця з двох значень, такого як активний або неактивний, створює величезні розділи індексу, а зчитування одного значення повертає половину таблиці.
  • Часто оновлювані колонки. Кожна зміна записує запис індексу та надгробок для старого, тому накопичення надгробків з часом погіршує читання.
  • Запити без ключа розділу. Без нього координатор повинен зв'язатися з кожним вузлом та об'єднати результати, що не масштабується при додаванні вузлів.

Довговічною альтернативою є друга таблиця, ключ якої відповідає стовпцю, який потребує пошуку, і яка записується одночасно з першою. Це відповідає принципу «спочатку запит», описаному в Cassandra правила моделі даних, і він зберігає кожне зчитування в одному розділі на одному вузлі.

Як робоче правило, індекс відповідає стовпцю помірної кардинальності, який запитується разом із відомим ключем розділу. Будь-що поза цим описом краще обслуговується спеціально створеною таблицею.

Поширені запитання

Жорсткого обмеження немає, але кожен індекс додає вартість запису та обсяг пам'яті. Два або три індекси на таблицю – це практична стеля; якщо це буде більше, перегляньте модель даних.

Ні. Існуючі рядки індексуються у фоновому режимі, а таблиця залишається доступною. Великі таблиці потребують часу, а прогрес можна відстежувати за допомогою nodetool compactionstats.

Індекс вказує на рядки в базовій таблиці. Матеріалізоване представлення — це окрема таблиця, яка підтримується автоматично з власним ключем розділу, тому її зчитування потрапляє в один розділ.

Враховуючи список запитів та кардинальність стовпців, ШІ може розумно ранжувати кандидатів. Він не бачить частоти оновлення, яка часто вирішує, чи буде індекс накопичувати надгробки.

Часто, тому що це призводить до виконання відхиленого запиту. Розглядайте цю пропозицію як сигнал про те, що дійсно потрібен або індекс, або нова таблиця запиту.

Підсумуйте цей пост за допомогою: